相关疑难解决方法(0)

是否可以动态编译和执行C#代码片段?

我想知道是否可以将C#代码片段保存到文本文件(或任何输入流),然后动态执行它们?假设提供给我的内容可以在任何Main()块中编译好,是否可以编译和/或执行此代码?出于性能原因,我更愿意编译它.

至少,我可以定义一个他们需要实现的接口,然后他们将提供一个实现该接口的代码"section".

c#

164
推荐指数
5
解决办法
11万
查看次数

编译并运行动态代码,而不生成EXE?

我想知道是否可以编译,并运行存储的代码,而不生成exe或任何类型的其他文件,基本上从内存中运行该文件.

基本上,Main应用程序将有一些存储代码(可能会更改的代码),并且需要编译代码并执行它.没有创建任何文件.

创建文件,运行程序,然后删除文件不是一个选项.编译后的代码需要从内存中运行.

代码示例,或指针,或几乎任何东西都欢迎:)

c# runtime-compilation

22
推荐指数
2
解决办法
2万
查看次数

C#脚本语言

这是一个有点奇怪的问题.

我想提供一种脚本语言来修改我为XNA构建的游戏.如果我将这些游戏部署到PC上,那么我就可以使用C#文件,在运行时编译(使用reflection.emit)作为脚本,这很好 - 这是一个很好的简单方法来修改游戏.但是,.net紧凑框架(这是xbox提供的)不支持reflection.emit,那么如何编写一个考虑到这一点的脚本语言呢?

  1. 有没有任何项目已经这样做了
  2. 是否有任何好的资源来启动我自己的项目来执行此操作
  3. 什么是最好的语言选择?这是用于游戏脚本,所以它可以是一个相当小的语言,只要它非常有效并且易于实现解释器

c# scripting xna interpreter

11
推荐指数
2
解决办法
4963
查看次数

使用C#动态编译代码

如何编写C#代码来编译和运行动态生成的C#代码.周围有例子吗?

我所追求的是动态构建一个C#类(或类)并在运行时运行它们.我希望生成的类与其他非动态的C#类进行交互.

我见过生成exe或dll文件的例子.我不是在那之后,我只是想让它在内存中编译一些C#代码然后运行它.例如,

所以这里有一个非动态的类,它将在我的C#程序集中定义,并且只会在编译时更改,

public class NotDynamicClass
{
    private readonly List<string> values = new List<string>();

    public void AddValue(string value)
    {
        values.Add(value);
    }

    public void ProcessValues()
    {
        // do some other stuff with values
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的动态类.我的C#代码将生成此类并运行它,

public class DynamicClass
{
    public static void Main()
    {
        NotDynamicClass class = new NotDynamicClass();

        class.AddValue("One");
        class.AddValue("two");
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是,最后我的非动态代码将调用ProcessValues,它会做一些其他的事情.动态代码的要点是允许我们或客户端向软件添加自定义逻辑.

谢谢.

.net dynamic c#-4.0

7
推荐指数
1
解决办法
6428
查看次数

从非托管代码调用托管.NET代码的最佳方法

我正在尝试找到从非托管C++代码调用托管.NET代码的最佳性能方法.我在C++应用程序中找到了有关Hosting .NET的信息,我可以创建一个pRuntimeHost并启动它而不会出现问题.

ExecuteInDefaultAppDomain似乎非常有限,因为我真的想发送一些参数并让它返回一个信息结构.最明显的替代方法是使用COM方法,但当前的C#代码并未真正设置为与方法的接口.

无论哪种方式,我想返回整数,字符串(char*)s,双精度和其他核心C++类型.双方都有太多代码将C++转换为C#,并且使用托管C++不是一个可接受的解决方案,因为使用此C++代码的其他组不希望出于性能原因而开始使用托管代码.

目标是尽可能少地修改现有的C++和C#代码,但仍然在C++中的特定点使用C#代码中的方法,而不会严重影响C++代码的速度.

根据Internet上的代码,托管.NET的启动和关闭顺序是:

#include "stdafx.h"
#include <metahost.h>

#pragma comment(lib, "mscoree.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    ICLRMetaHost       *pMetaHost       = NULL;
    ICLRMetaHostPolicy *pMetaHostPolicy = NULL;
    ICLRDebugging      *pCLRDebugging   = NULL;

    HRESULT hr;
    hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost);
    hr = CLRCreateInstance(CLSID_CLRMetaHostPolicy, IID_ICLRMetaHostPolicy, (LPVOID*)&pMetaHostPolicy);
    hr = CLRCreateInstance(CLSID_CLRDebugging, IID_ICLRDebugging, (LPVOID*)&pCLRDebugging);

    DWORD dwVersion = 0;
    DWORD dwImageVersion = 0;
    ICLRRuntimeInfo *pRuntimeInfo;
    hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_ICLRRuntimeInfo, (LPVOID *)&pRuntimeInfo);

    ICLRRuntimeHost * pRuntimeHost = NULL;
    hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID *)&pRuntimeHost);

    hr = pRuntimeHost->Start();

    DWORD dwRetCode …
Run Code Online (Sandbox Code Playgroud)

c# c++ unmanaged managed

7
推荐指数
1
解决办法
4884
查看次数