将InMemory编译的程序集加载到当前域中

时间:2011-03-11 18:59:26

标签: c# compiler-construction assemblies assembly-loading

我正在使用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最终为空。现在我怀疑虽然程序集已编译但未加载。我似乎无法找到将此程序集加载到域中,以便可以解析其类型名称。

任何人都可以启发我吗?

2 个答案:

答案 0 :(得分:6)

我担心这显然是不可能的。

documentation for Type.GetType明确指出:

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

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

答案 1 :(得分:5)

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

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