在我的反思研究期间,我遇到了.net模块。
我理解这意味着我可以将单个类编译为.net模块(如果我错了,请更正我)然后使用Assembly.LoadModule(string,byte [])加载此编译的.net模块。
我写了一个看起来像这样的课:
using System;
using System.Text;
public class Mycs {
public static string GiveString(){
return "Hello World !";
}
}
使用以下代码使用开关“/ target:module”编译它:
CodeDomProvider CDP = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters CP = new CompilerParameters();
CP.GenerateExecutable = false;
CP.CompilerOptions = "/target:module";
CP.OutputAssembly = FilePathText.Text.Replace(Strings.Right(FilePathText.Text, 3), ".netmodule");
string source = File.ReadAllText(FilePathText.Text);
CompilerResults RS = CDP.CompileAssemblyFromSource(CP, source);
然后我检索了结果文件字节:
byte[] b = File.ReadAllBytes(FilePathText.Text);
最后我尝试将模块加载到当前执行的程序集中:
Module[] Modules = Assembly.GetExecutingAssembly().GetModules();
Module[] moduless = Assembly.GetExecutingAssembly().GetLoadedModules();
Module A = Assembly.GetExecutingAssembly().LoadModule(Modules[0].Name, b);
我是否通过Modules[0].Name
或moduless[0].Name
都会导致此异常:
mscorlib.dll中出现未处理的“System.ArgumentException”类型异常 附加信息:文件名无效
为什么我会收到无效的文件名错误?
答案 0 :(得分:1)
您无法将动态创建的模块加载到现有程序集,编译后的程序集是不可变的。
我最好的猜测是你需要使用AssemblyBuilder.DefineDynamicModule()来创建你的类。在这种情况下,您创建的类型将自动加载。或者将您的类编译为程序集,而不是模块,并使用Assembly.LoadFile方法动态加载这些程序集。