簡體   English   中英

嘗試構建一個包含所有附屬資源程序集的WinForms應用程序

[英]Trying to build a WinForms application with all satellite resource assemblies included

我正在使用VS 2013構建一個作為單個EXE文件提供的C#WinForms應用程序。 到目前為止,使用ilmerge作為構建后步驟以包括所有需要的DLL沒問題。 甚至ActiveX組件也可以毫無問題地嵌入。

但是現在,我將使該應用程序國際化,這將導致生成本地化的衛星資源集合。 我當前的解決方案如下:

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

下次執行Build時,它將資源文件夾i18n\\en下的資源作為嵌入式資源嵌入到目標中。 在我的應用程序中,我對AppDomain.CurrentDomain.AssemblyResolve事件使用自己的ResolveEventHandler ,從應用程序的內部資源讀取請求的DLL。

效果很好,但是:提交涉及本地化DLL的更改后,我必須構建兩次解決方案才能將新的DLL放入輸出EXE。

使用ilmerge包含附屬程序集並不成功,因為它會解壓縮DLL,並將其中包含的對象直接放入EXE文件。

因此,我的問題是,是否可以通過以下方式修改.csproj文件:生成DLL之后,可以將資源打包到輸出二進制文件中之前將其復制到資源目錄中,而不是第一次構建進行復制。 這樣,只需要一次構建過程就可以避免錯誤。

我現在可以正常工作了,但是它的方式與我最初尋找的方式不同。

我沒有使用Visual Studio / MS Build將DLL嵌入為嵌入式資源,而是制作了一個ResourceEmbedder工具,用於隨后嵌入資源。 它使用Mono.Cecil完成此操作。 所以現在的機制是:

  1. 以標准VS方式構建目標EXE文件。
  2. 生成后:使用ResourceEmbedder工具嵌入所有附屬程序集。
  3. 構建后:使用ilmerge嵌入所有外部DLL。
  4. 在運行時,掛鈎到AppDomain.CurrentDomain.AssemblyResolve事件,以便在需要時提供附屬程序集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM