如何将CSharpCodeProvider生成的程序集持久化为byte []?

时间:2015-06-16 16:14:10

标签: c# .net-assembly

我的目标是使用CSharpCodeProvider生成一个程序集,然后将其转换为byte [],以便它可以存储在数据库中供以后使用。

我尝试使用的代码如下:

public static Assembly Compile(String sourceCode)
{
    var codeProvider = new CSharpCodeProvider();
    var parameters = new CompilerParameters();

    parameters.CompilerOptions = "/optimize";
    parameters.GenerateExecutable = false;
    parameters.GenerateInMemory = false;
    parameters.IncludeDebugInformation = false;
    parameters.OutputAssembly = "my.dll";
    parameters.GenerateInMemory = true;

    parameters.ReferencedAssemblies.Add("System.dll");
    parameters.ReferencedAssemblies.Add("System.Core.dll");
    parameters.ReferencedAssemblies.Add("System.Data.dll");
    parameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");

    CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, sourceCode);
    Assembly assembly = null;

    if (!results.Errors.HasErrors)
    {
        assembly = results.CompiledAssembly;
        return assembly;
    }
    throw new Exception("Invalid source code");
}

我已使用以下方法成功测试了返回的程序集:

var assembly = SchemaBuilder.Compile(sourceCode); 
var personType = assembly.GetType("app.Person");
object personObject = Activator.CreateInstance(personType);
Assert.IsNotNull(personObject);

问题在于,当我将其转换为byte []并尝试在之后加载它时,我会不断收到异常,就好像转换过程中程序集已损坏一样:

var assembly = SchemaBuilder.Compile(sourceCode);

byte[] dllAsArray;

using (MemoryStream stream = new MemoryStream())
{
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, assembly);
    dllAsArray = stream.ToArray();
}

Assembly assemblyFromByteArray = Assembly.Load(dllAsArray);

例外:

System.BadImageFormatException: Could not load file or assembly '171 bytes loaded from builder.test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format. ---> System.BadImageFormatException: Bad IL format. 

0 个答案:

没有答案