System.ArgumentException Assembly.LoadModule中的文件名无效(string,byte [])

时间:2015-04-09 08:11:59

标签: c# .net system.reflection

在我的反思研究期间,我遇到了.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].Namemoduless[0].Name都会导致此异常:

  

mscorlib.dll中出现未处理的“System.ArgumentException”类型异常   附加信息:文件名无效

为什么我会收到无效的文件名错误?

1 个答案:

答案 0 :(得分:1)

您无法将动态创建的模块加载到现有程序集,编译后的程序集是不可变的。

我最好的猜测是你需要使用AssemblyBuilder.DefineDynamicModule()来创建你的类。在这种情况下,您创建的类型将自动加载。或者将您的类编译为程序集,而不是模块,并使用Assembly.LoadFile方法动态加载这些程序集。