幾天來,我一直試圖弄清楚如何將我的本機 C DLL 依賴項包含在我的 ClickOnce 部署中,該部署是使用 VS2019 構建的 C# WinForms 應用程式。本機 DLL 不會出現在主 .NET 應用程式的“屬性”頁面上的“發布”->“應用程式檔案”下(盡管 .NET DLL 會出現)。
我已經讀了一百遍:
將本機 DLL 的構建操作設定為“內容”。
......我認為我解釋/做錯了。
本機 C 專案的輸出自然不會“包含”在任何專案中(這是公開構建操作屬性的明顯先決條件),因此不會出現在解決方案資源管理器中以允許我將其設定為“內容”。所以我
[解決方案資源管理器] -> 專案 -> 添加 -> 現有專案 -> [選擇本機 C DLL]
將本機 C DLL 添加到專案以啟用構建操作屬性,然后我將其設定為“內容”。{重要說明:它必須“包含”在專案中,而不僅僅是獲取構建操作屬性的解決方案。}
所以我這樣做并且它有效,但是當然我必須選擇本機 DLL 的特定平臺和配置(例如,x64 和版本),并且此選擇是固定的(在我構建時不受 VS2019 GUI 中的選擇的控制) ),更糟糕的是——甚至沒有標明專案中“包含”了哪個平臺和配置。{旁注:我如何不必在“發布”->“應用程式檔案”下選擇要使用的 .NET DLL 版本(x86 還是 x64)? 它只是自動選擇正確的?我如何設定一個 x86 版本和一個 x64 版本,我可以在它們之間來回切換 & 構建每個版本?} 我無法想象這是應該完成的方式。它易碎且不透明。當然還有更好的方法。我想我錯過了其他人認為“顯而易見”的東西。任何其他嘗試使用或維護此配置的開發人員都會詛咒我的名字,并且這樣做是正確的。
使 ClickOnce 部署(通過 VS2019 GUI)在 ClickOnce 部署包中包含我的本機 DLL(相同解決方案中包含的專案)的“正確方法”是什么?
請注意,我在本機 C 專案的“屬性”頁面中找到了一個有希望的設定:自定義構建設定 -> 常規 -> 將輸出視為內容。但它似乎沒有任何效果。
我將永遠感激任何指點。
uj5u.com熱心網友回復:
改編自這里:
編譯您的解決方案。
右鍵單擊托管專案并選擇“添加/現有專案”。不要使用“添加參考”。
導航到您編譯的本機 DLL 并選擇它(根據需要調整檔案型別以公開它)。
單擊“添加”拆分按鈕中的向下箭頭并選擇“添加為鏈接”(這允許我們不保留浮動的多個 DLL 副本)。
右鍵單擊新添加的檔案并選擇“屬性”。
確保“構建操作”是“內容”并且“復制到輸出目錄”設定為“不復制”(因為您已經在其他地方自動執行了該任務,早在進入開發部署階段之前)。
請注意,在正確清理所有輸出檔案夾后,您將在初始構建時收到“找不到檔案”錯誤,但無論如何都會創建本機 DLL,在下一次完整構建時搶占該錯誤。
在 .NET 應用程式的“屬性”頁面上,執行“發布”->“應用程式檔案”->“全部重置”以將本機 DLL 填充到串列中。調整“發布狀態”等。阿爾。如所須。
發布。
我發現我可以在專案保持“虛擬”的檔案夾結構來存盤鏈接到本機DLL的不同版本(例如,86對x64和除錯與發布),同時不會搞亂檔案系統(和確保 DLL 不是陳舊的):通過解決方案資源管理器添加檔案夾結構(例如,“.\NativeDLLs\x64\Release”等),并僅將鏈接(非真實檔案)添加到檔案夾中。然后使用 Windows 資源管理器或 shell 命令從檔案系統中洗掉檔案夾。從檔案系統中洗掉后,它們將保留在解決方案資源管理器中,因為它們仍包含鏈接。
這些虛擬檔案夾的層次結構現在僅存在于專案檔案 ([appname.csproj]) 中,作為專案組元素中的內容元素(包含鏈接)(這似乎是讓它們出現在 ClickOnce 部署世界中的關鍵) .
一個會有所幫助的指標(對我自己):不要害怕點擊“發布”->“應用程式檔案”對話框上的“全部重置”按鈕。
uj5u.com熱心網友回復:
經過一天左右的改進后,我發現 VS2019 GUI 只是為此目的而不足。更好的答案是手動編輯 .csproj 檔案以將 .NET 專案包含在本機 DLL 作為Content 中。在該專案檔案中找到其他元素并添加本機 DLL,如下所示:
<ItemGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<Content Include="..\bin\MyApp\x64\Release\native1.dll">
</Content>
<Content Include="..\bin\MyApp\x64\Release\native2.dll">
</Content>
</ItemGroup>
<ItemGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<Content Include="..\bin\MyApp\x86\Release\native1.dll">
</Content>
<Content Include="..\bin\MyApp\x86\Release\native2.dll">
</Content>
</ItemGroup>
(其中 *..\bin\MyApp{x86|x64}{Debug|Release}* 是您的輸出檔案夾,其中您的本機 DLL、native1.dll和native2.dll已被復制、編譯后供您的 . NET 應用程式,MyApp.exe)。當然,x86檔案夾包含 32 位本機 DLL,x64檔案夾包含 64 位本機 DLL 等 - 您知道練習。
沒有混淆的額外鏈接和諸如此類的東西會使解決方案/專案混亂,并且 .dll 檔案出現在它們應該出現的位置,而不是單獨的子目錄中。
當然,您可以為其余條件添加其他元素——即除錯版本,但誰想要除錯版本的 ClickOnce 部署?您可能直接從 Visual Studio 運行它們,對嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/398233.html
