Dot-Net

跨 CPU 架構從 Windows 10 通用應用程序引用 C Dll

  • August 9, 2016

基本問題/摘要:我需要從 Win 10 通用應用程序項目中引用其他人用 C 語言創建的二進製文件 (dll)。但是,x86 和 arm 有一個單獨的 dll。我相信我需要從項目中引用 dll(或至少 winmd 文件)才能部署它,但我只能引用一個文件,不能同時引用這兩個文件。這意味著應用程序在一個或另一個平台(桌面或手機)上失敗,因為它包含錯誤的二進製文件。尋找解決方案。

更詳細的解釋;

我正在嘗試編寫一個通用 Windows 應用程序(新的 Windows 10 樣式)。這意味著我有一個項目可以添加對外部組件的引用。

我需要一些最好作為 3rd 方組件購買而不是內部開發的圖像處理東西。支持 WinRT 的第三方提供了多個 SDK,但沒有一個專門支持 UWA。然而,WinRT SDK 都有用於 Windows Phone 和 Windows 桌面應用程序的不同二進製文件。並且二進製文件都是從 C/C++ 原始碼創建的。這對於較舊的“通用”應用程序來說很好,因為手機和桌面有一個單獨的項目,因此您可以在每個項目中引用不同的組件,但現在只有一個項目可以添加引用。

我向一家供應商詢問了有關 UWA 支持的問題,他們聲稱這是不可能的,他們無法創建針對兩個平台(arm vs x86)的單個二進製文件,並且他們不知道我的 UWA 在應用程序時引用正確文件的方法是為適當的架構而建構的(這是我認為應該發生的)。

假設有某種方式(可能在 winmd 文件中?)說,‘嘿,這是不同 CPU 架構的相同 dll 的兩個副本,選擇你正在建構的那個’,只要公共 API 匹配應用程序只使用正確的?

有解決方案嗎?有誰知道這種參考應該如何工作?還是我只是運氣不好?

謝謝。

有一種方法可以在項目中引用具有不同架構的相同 DLL,但您不能直接從 VS 中執行此操作。您將不得不手動編輯 csproj 文件。

在您的 csproj 文件中,您必須轉到底部並找到這些部分。這些部分引用了您的所有文件。

項目定義中有一個特殊的標籤,允許您告訴 Visual Studio 根據某些條件執行某些特定操作。然後,您可以創建一個將引用您的 DLL 依賴項的組。您的 csproj 文件將如下所示:(我已刪除所有不相關的內容)

<Project>
 <PropertyGroup />
 <PropertyGroup />
 <PropertyGroup />
 <ItemGroup />
 <ItemGroup />
 <Choose>
   <When Condition=" '$(Platform)' == 'x86' ">
     <ItemGroup>
       <Content Include="..\Binaries\x86\MyLib1.winmd">
           <CopyToOutputDirectory>Always</CopyToOutputDirectory>
       </Content>
        <Content Include="..\Binaries\x86\MyLib2.winmd">
         <CopyToOutputDirectory>Always</CopyToOutputDirectory>
       </Content>
     </ItemGroup>
   </When>
   <When Condition=" '$(Platform)' == 'ARM' ">
     <ItemGroup>
       <Content Include="..\Binaries\ARM\MyLib1.winmd">
           <CopyToOutputDirectory>Always</CopyToOutputDirectory>
       </Content>
        <Content Include="..\Binaries\ARM\MyLib2.winmd">
         <CopyToOutputDirectory>Always</CopyToOutputDirectory>
       </Content>
     </ItemGroup>
   </When>
 </Choose>
 <Import />
 <Import />
</Project>

我已經在 VS2013 上將它用於一些 Windows Phone 項目(讓它們在手機和模擬器上都可以工作)。我沒有在 Windows 10 和 VS2015 上測試過,但它應該以相同的方式工作。

引用自:https://stackoverflow.com/questions/30971006