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

C# 在运行时使用CodeDom.CompilerResults生成程序集(.dll)时生成清单,c#,reflection,manifest,codedom,C#,Reflection,Manifest,Codedom,我正在运行时生成程序集(*.dll)。编译过程是使用CodeDom执行的,如以下文章中所建议的: 我的代码和程序集已成功生成,而不是错误。当我尝试在运行时通过反射加载此生成的程序集时,会出现问题,使用: // load for reflection only var _assemblyTempLoad = Assembly.LoadFrom(assembly.FullName); 引发以下异常: “无法加载文件或程序集'nameforassembly.dll'或其 依赖项。模块应包含程序

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

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

 // load for reflection only
 var _assemblyTempLoad = Assembly.LoadFrom(assembly.FullName);
引发以下异常:

“无法加载文件或程序集'nameforassembly.dll'或其 依赖项。模块应包含程序集 清单。”

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

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

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

提前感谢您

您尝试过以下方法吗

compilerParameters.CompilerOptions = string.Format("/win32manifest: {0}", manifestFilename);
如果您已经将
编译器选项设置为某个值,只需连接字符串即可

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

告诉编译器也生成清单文件。

您是否尝试过以下操作

compilerParameters.CompilerOptions = string.Format("/win32manifest: {0}", manifestFilename);
如果您已经将
编译器选项设置为某个值,只需连接字符串即可

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

告诉编译器也生成清单文件。

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

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

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

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

文件是否可能已损坏,或编译的框架错误,或编译为64位,而您正试图加载到32位进程中?如果尝试将编译后的dll添加到项目中(就像测试一样),可能会出现更准确的错误。如果提供链接到的dll,则可以通过添加类似于parameters的行来指定平台。CompilerOptions=“/platform:anycpu”;文件是否可能已损坏,或编译的框架错误,或编译为64位,而您正试图加载到32位进程中?如果尝试将编译后的dll添加到项目中(就像测试一样),可能会出现更准确的错误。如果提供链接到的dll,则可以通过添加类似于parameters的行来指定平台。CompilerOptions=“/platform:anycpu”;