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最终为空.现在我怀疑虽然程序集已编译但未加载.我似乎无法找到将此程序集加载到域中,以便可以解析其类型名称.
任何人都可以开导我吗?
我担心这显然是不可能的.
Type.GetType的文档明确指出:
如果在调用GetType时尚未将程序集保存到磁盘,则该方法返回null.GetType不了解瞬态动态组件; 因此,调用GetType以检索瞬态动态程序集中的类型将返回null.
如果希望程序集像任何常规程序集一样,则必须将程序集写入磁盘.
GenerateInMemory属性是一个客厅技巧.C#编译器不知道如何写入程序的内存.它是伪造的,要求编译器实际将程序集写入TEMP目录.从编译成功后将FileStream加载到内存中的字节[],然后是Assembly.Load(byte []).看看Reflector,Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch()方法.
因为它无论如何都会创建一个文件,只是不太明显,只需让它创建一个文件并将其加载到AppDomain中即可解决您的问题.
| 归档时间: |
|
| 查看次数: |
2830 次 |
| 最近记录: |