我正在使用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
最终为空。现在我怀疑虽然程序集已编译但未加载。我似乎无法找到将此程序集加载到域中,以便可以解析其类型名称。
任何人都可以启发我吗?
答案 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中即可解决问题。