我正在运行时生成程序集(* .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));`
提前谢谢
答案 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));