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

Ant*_*nes 4 c# compiler-construction assemblies assembly-loading

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

在编译之后,我可以采取CompilerResults并执行以下操作: -

 object x = cr.CompiledAssembly.CreateInstance("MyGeneratedClass");
 Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)

我得到了预期的输出,CreateInstance已经有效了.

但是,我需要能够在AppDomain没有组装知识的情况下访问当前类型.我需要做这样的事情: -

 Type t = Type.GetType("MyGeneratedClass");
 object x = Activator.CreateInstance(t);
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以开导我吗?

Fyo*_*kin 6

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

Type.GetType文档明确指出:

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

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


Han*_*ant 5

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

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