【问题标题】:Generating manifest when assembly (.dll) is generated at runtime using CodeDom.CompilerResults在运行时使用 CodeDom.CompilerResults 生成程序集 (.dll) 时生成清单
【发布时间】:2012-07-14 04:24:21
【问题描述】:

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

提前谢谢你

【问题讨论】:

  • 文件是否损坏或编译为错误的框架或编译为 64 位,而您正试图加载到 32 位进程?如果您尝试将编译后的 dll 添加到您的项目中(仅作为测试),您可能会得到更准确的错误。
  • 给出相同的链接,您可以通过添加类似参数的行来指定平台。CompilerOptions = "/platform:anycpu" ;

标签: c# reflection manifest codedom


【解决方案1】:

您是否尝试过以下方法

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多