我的目标是使用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.