我想知道是否可以将C#代码片段保存到文本文件(或任何输入流),然后动态执行它们?假设提供给我的内容可以在任何Main()块中编译好,是否可以编译和/或执行此代码?出于性能原因,我更愿意编译它.
至少,我可以定义一个他们需要实现的接口,然后他们将提供一个实现该接口的代码"section".
我想知道是否可以编译,并运行存储的代码,而不生成exe或任何类型的其他文件,基本上从内存中运行该文件.
基本上,Main应用程序将有一些存储代码(可能会更改的代码),并且需要编译代码并执行它.没有创建任何文件.
创建文件,运行程序,然后删除文件不是一个选项.编译后的代码需要从内存中运行.
代码示例,或指针,或几乎任何东西都欢迎:)
这是一个有点奇怪的问题.
我想提供一种脚本语言来修改我为XNA构建的游戏.如果我将这些游戏部署到PC上,那么我就可以使用C#文件,在运行时编译(使用reflection.emit)作为脚本,这很好 - 这是一个很好的简单方法来修改游戏.但是,.net紧凑框架(这是xbox提供的)不支持reflection.emit,那么如何编写一个考虑到这一点的脚本语言呢?
如何编写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,它会做一些其他的事情.动态代码的要点是允许我们或客户端向软件添加自定义逻辑.
谢谢.
我正在尝试找到从非托管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)