尝试构建包含所有卫星资源程序集的WinForms应用程序

时间:2014-05-30 13:51:30

标签: c# winforms msbuild ilmerge satellite-assembly

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

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

  1. Build在(例如)..... \en\MyApp.resources.dll
  2. 下生成DLL
  3. 构建后操作会将此DLL复制到..\..\Resources\i18n\en
  4. 下次执行Build时,它会将资源文件夹i18n\en下的资源作为Embedded Resource嵌入到目标中。在我的应用程序中,我使用自己的ResolveEventHandler作为AppDomain.CurrentDomain.AssemblyResolve事件,从应用程序的内部资源中读取请求的DLL。

    这很好用,但是:提交涉及本地化DLL的更改后,我必须构建解决方案两次,以便将新DLL放入输出EXE。

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

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

1 个答案:

答案 0 :(得分:0)

我现在正在使用它,但其方式与我最初寻找的方式不同。

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

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