4

CSharpCodeProvider用来编译程序集,我将CompileParameters GenerateInMemory属性设置为,true因为我不想创建物理文件。

编译后我可以采取CompilerResults并做这样的事情: -

 object x = cr.CompiledAssembly.CreateInstance("MyGeneratedClass");
 Console.WriteLine(x);

我得到了预期的输出,CreateInstance已经奏效了。

但是,我需要能够在AppDomain不了解程序集的情况下访问当前的类型。我需要做这样的事情: -

 Type t = Type.GetType("MyGeneratedClass");
 object x = Activator.CreateInstance(t);

问题在于这段代码t最终为空。现在我怀疑虽然程序集已编译但未加载。我似乎无法找到将此程序集加载到域中以便可以解析其类型名称。

任何人都可以启发我吗?

4

2 回答 2

6

恐怕这显然是不可能的。

Type.GetType的文档清楚地指出:

如果调用 GetType 时程序集尚未保存到磁盘,则该方法返回 null。GetType 不理解瞬态动态程序集;因此,调用 GetType 以检索瞬态动态程序集中的类型将返回 null。

如果您希望它像任何常规程序集一样运行,则必须将程序集写入磁盘。

于 2011-03-11T19:12:27.887 回答
5

GenerateInMemory 属性是一个客厅技巧。C# 编译器不知道如何写入程序的内存。它是伪造的,要求编译器实际将程序集写入 TEMP 目录。编译成功后将它从哪里加载到内存中,将 FileStream 加载到 byte[],然后是 Assembly.Load(byte[])。看看反射器,Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch() 方法。

由于它无论如何都会创建一个文件,只是不是很明显,因此只需让它创建一个文件并将其加载到 AppDomain 中即可解决您的问题。

于 2011-03-11T19:09:36.390 回答