我正在使用VS 2013构建一个C#WinForms应用程序,该应用程序作为单个EXE文件提供。到目前为止,使用ilmerge作为构建后步骤以包含所有需要的DLL是没有问题的。甚至可以毫无问题地嵌入ActiveX组件。
但是现在,我要将应用程序国际化,从而生成本地化的卫星资源集合。我目前的解决方案如下:
\en\MyApp.resources.dll
..\..\Resources\i18n\en
下次执行Build时,它会将资源文件夹i18n\en
下的资源作为Embedded Resource嵌入到目标中。在我的应用程序中,我使用自己的ResolveEventHandler
作为AppDomain.CurrentDomain.AssemblyResolve
事件,从应用程序的内部资源中读取请求的DLL。
这很好用,但是:提交涉及本地化DLL的更改后,我必须构建解决方案两次,以便将新DLL放入输出EXE。
使用ilmerge
包含附属程序集是不成功的,因为它解压缩DLL并将其中包含的对象直接放入EXE文件中。
所以,我的问题是我是否可以修改.csproj文件,以便生成DLL后我可以将资源打包到输出二进制文件之前将其复制到资源目录中,而不是在第一次构建之后复制。这样只需要一次构建过程就可以避免错误。
答案 0 :(得分:0)
我现在正在使用它,但其方式与我最初寻找的方式不同。
我没有使用Visual Studio / MS Build将DLL作为嵌入式资源嵌入,而是使用工具 ResourceEmbedder 来嵌入资源。它使用Mono.Cecil来完成此任务。所以机制现在是:
AppDomain.CurrentDomain.AssemblyResolve
事件,以便在需要时提供附属程序集。