亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于當前操作系統 在 Visual Studio 或 MonoDevelop 中的每個構建中將本機庫

基于當前操作系統 在 Visual Studio 或 MonoDevelop 中的每個構建中將本機庫

C#
一只甜甜圈 2021-11-21 14:51:05
我正在開發一個 C# WinForms 項目,目前正在 VS 2017 中開發,不過,它將使用 Mono 框架 ( MonoRuntime)部署在帶有 Ubuntu 16.04 LTS 的 Linux 機器上。我正在引用EmguCV v3.2和SQLite在我的項目中。這兩個都是 .NET 托管程序集,依賴于它們自己的本機庫(EmguCV使用cvextern.dll和SQLite使用SQLite.Interop.dll)。由于這個程序將在Linux計算機上進行部署,我編譯和建造的.so庫文件對他們倆的(libcvextern.so并且libSQLite.Interop.so要準確)成功。為了讓我的應用程序在 Windows 上運行,這 2 個.so文件是多余的,而當我的應用程序在 Mono 下的 Linux 上運行時它們是必需的(并且它們必須始終在執行目錄中!)。我的問題是,我想讓 Visual Studio 2017 或 MonoDevelop 明白,如果我在 Windows 上構建(調試/發布),我需要將.dll文件復制到輸出目錄(或),.so如果在 Linux上的文件類似。你如何看待這個問題?那么,如何正確設置 VS 2017 和 MonoDevelop 都遵守的 Post-Build 事件,它們在構建時識別底層當前操作系統并將相應的 lib 文件復制到輸出目錄?為任何英語語法問題道歉,我是非母語者。任何指針表示贊賞!
查看完整描述

1 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

好的,我已經分 3 個步驟解決了這個問題(在搜索了幾個小時之后)。

如上所述,.dll如果項目是在 Windows 上構建(調試/發布),我的要求是將文件復制到輸出目錄,如果項目是.so在 Linux 上使用 MonoDevelop 構建(調試/發布),則復制對應的庫。

  1. 我將庫復制到我的項目文件夾中的目錄(安全的某個地方),然后Add Existing Item在 VS 2017 中使用了--> 選擇了所需的庫文件 --> 使用Add as Link而不是Open (從這里找到)。

  2. 我需要將它們復制到輸出目錄,而沒有從我將它們添加到項目時繼承的文件夾結構,所以我遵循了這個問題公認答案,并能夠指示它在每次構建時復制到輸出目錄。

  3. 現在對于最后一個要求,即根據底層操作系統復制特定文件,我使用了文件中的Condition屬性。這是我所做的:ItemPropertyGroup.csproj

.dll如果基本操作系統是 Windows,我有 1 個要包含在內,如果是.solinux,則有2 個文件要包含在內,這是我在.csproj文件中修改的對它們的配置。

<ContentWithTargetPath Include="references\libDependencies\linux64\libcvextern.so" Condition=" '$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' ">

  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

  <TargetPath>libcvextern.so</TargetPath>

</ContentWithTargetPath>



<ContentWithTargetPath Include="references\libDependencies\linux64\libSQLite.Interop.so" Condition=" '$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' ">

  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

  <TargetPath>libSQLite.Interop.so</TargetPath>

</ContentWithTargetPath>



<ContentWithTargetPath Include="references\libDependencies\win64\cvextern.dll" Condition=" '$(OS)' == 'Windows_NT' ">

  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

  <TargetPath>cvextern.dll</TargetPath>

</ContentWithTargetPath>

正如預期的那樣,從現在開始,每次構建(調試/發布)時,都會將相應的庫復制到輸出目錄中。就這么多了,希望對大家有所幫助。


查看完整回答
反對 回復 2021-11-21
  • 1 回答
  • 0 關注
  • 241 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號