使用CodeDom.CompilerResults在运行时生成程序集(.dll)时生成清单

时间:2012-07-14 16:20:50

标签: c# reflection manifest codedom

我正在运行时生成程序集(* .dll)。编译过程使用CodeDom执行,如以下帖子中所建议的那样:

Generating DLL assembly dynamically at run time

我的代码和程序集生成成功,而不是错误。当我尝试通过反射在运行时加载这个生成的程序集时出现问题:

 // load for reflection only
 var _assemblyTempLoad = Assembly.LoadFrom(assembly.FullName);

抛出以下异常:

  

“无法加载文件或程序集'nameforassembly.dll'或其中一个   依赖。该模块预计包含一个程序集   清单“。

如何生成清单文件或修复此问题?

我想澄清一下,程序集是在运行时生成的,使用以下代码:

CompilerResults compilerResult = codeDomProvider.CompileAssemblyFromFile(compilerParameters, Path.Combine(path, sourceCodeFile));`

提前谢谢

2 个答案:

答案 0 :(得分:0)

您是否尝试过以下

compilerParameters.CompilerOptions = string.Format("/win32manifest: {0}", manifestFilename);

如果您已将CompilerOptions设置为某个值,则只需连接字符串

compilerParameters.CompilerOptions += string.Format(" /win32manifest: {0}", manifestFilename);

The win32manifest parameter告诉编译器也生成一个清单文件。

答案 1 :(得分:0)

在运行时(动态)创建程序集时,程序集信息或元数据不会自动放入程序集中。 [Assembly]属性的使用也是必要的。通过这种方式,该过程的最后一步是将/ platform参数放入编译器(感谢sgmoore)。我可以使用Redgate反射器看到这个。显示的程序集没有版本控制和元数据属性。像这样:

streamWriter.WriteLine(string.Format("[assembly: AssemblyTitle(\"{0}\")]", yourassembly.propertyfornamespace.Replace(" ", "")));
streamWriter.WriteLine(string.Format("[assembly: AssemblyDescription(\"{0}\")]", yourassembly.propertywithdescription));