我想知道是否可以编译,并运行存储的代码,而不生成exe或任何类型的其他文件,基本上从内存中运行该文件.
基本上,Main应用程序将有一些存储代码(可能会更改的代码),并且需要编译代码并执行它.没有创建任何文件.
创建文件,运行程序,然后删除文件不是一个选项.编译后的代码需要从内存中运行.
代码示例,或指针,或几乎任何东西都欢迎:)
我有一个方便的实用程序方法,它接受代码并吐出内存中的程序集.(它使用CSharpCodeProvider,虽然我不认为这应该重要.)这个程序集像任何其他反射一样工作,但当与dynamic关键字一起使用时,似乎失败了RuntimeBinderException:
'object'不包含'Sound'的定义
例:
var assembly = createAssembly("class Dog { public string Sound() { return \"woof\"; } }");
var type = assembly.GetType("Dog");
Object dog = Activator.CreateInstance(type);
var method = type.GetMethod("Sound");
var test1Result = method.Invoke(dog, null); //This returns "woof", as you'd expect
dynamic dog2 = dog;
String test2Result = dog2.Sound(); //This throws a RuntimeBinderException
Run Code Online (Sandbox Code Playgroud)
有谁知道DLR无法处理这个问题的原因?有什么办法可以解决这个问题吗?
编辑:
createAssembly方法:
免责声明:其中一些内容包含扩展方法,自定义类型等.但它应该是不言自明的.
private Assembly createAssembly(String source, IEnumerable<String> assembliesToReference = null)
{
//Create compiler
var codeProvider = new CSharpCodeProvider();
//Set compiler …Run Code Online (Sandbox Code Playgroud)