0

我正在使用 VS 2013 构建作为单个 EXE 文件发布的 C# WinForms 应用程序。到目前为止,使用 ilmerge 作为构建后步骤以包含所有需要的 DLL 没有问题。甚至 ActiveX 组件也可以毫无问题地嵌入。

但是现在,我要使应用程序国际化,从而生成本地化的卫星资源程序集。我目前的解决方案如下:

  1. Build 在(例如)下生成 DLL .....\en\MyApp.resources.dll
  2. 生成后操作将此 DLL 复制到..\..\Resources\i18n\en

下次执行 Build 时,它将资源文件夹下的资源i18n\en作为 Embedded Resource 嵌入到目标中。在我的应用程序中,我使用自己ResolveEventHandlerAppDomain.CurrentDomain.AssemblyResolve事件,从应用程序的内部资源中读取请求的 DLL。

这工作正常,但是:在提交涉及本地化 DLL 的更改后,我必须构建解决方案两次才能将新 DLL 放入输出 EXE。

使用ilmergefor 包含附属程序集没有成功,因为它解压缩 DLL 并将其中包含的对象直接放入 EXE 文件中。

所以,我的问题是我是否可以修改 .csproj 文件,以便在生成 DLL 之后,我可以在将资源打包到输出二进制文件之前将其复制到资源目录中,而不是在第一次构建之后复制。这样一来,只需要一次构建过程,就可以避免错误。

4

1 回答 1

0

我现在让它工作了,但与我最初寻找的方式不同。

我没有使用 Visual Studio / MS Build 将 DLL 作为嵌入式资源嵌入,而是制作了一个工具ResourceEmbedder用于之后嵌入资源。它使用Mono.Cecil来完成此任务。所以现在的机制是:

  1. 以标准 VS 方式构建目标 EXE 文件。
  2. 构建后:使用ResourceEmbedder工具嵌入所有附属程序集。
  3. 构建后:使用ilmerge嵌入所有外部 DLL。
  4. 在运行时,挂钩AppDomain.CurrentDomain.AssemblyResolve事件以便在需要时提供附属程序集。
于 2014-05-30T15:39:46.197 回答