2015-06-22 49 views
8

基本問題/摘要:我需要引用由Win 10通用應用程序項目中其他人創建的二進制文件(dll)。但是,x86和arm有一個單獨的dll。我相信我需要從項目中引用dll(或者至少是winmd文件)來部署,但我只能引用一個文件而不是兩個文件。這意味着應用程序在一個平臺或另一個平臺(桌面或電話)上失敗,因爲它包含錯誤的二進制文件。尋找解決方案。從Windows 10通用應用程序引用C Dll跨CPU體系結構

更詳細的解釋;

我想寫一個通用Windows應用程序(新的Windows 10風格)。這意味着我有一個項目來添加對外部組件的引用。

我需要一些圖像處理的東西,最好作爲第三方組件購買,而不是在內部開發。有幾個SDK可以從支持WinRT的第三方獲得,但沒有一個支持UWA。 WinRT SDK的Windows Phone和Windows桌面應用程序都有不同的二進制文件。並且二進制文件都是從C/C++源代碼創建的。這對舊的'通用'應用程序來說很好,因爲手機和桌面上有一個單獨的項目,所以您可以在每個項目中引用不同的組件,但現在只有一個項目可以添加引用。

我問一個供應商有關UWA支持,他們聲稱這是不可能的,他們不能創建一個單一的二進制文件來瞄準兩個平臺(arm vs x86),他們不知道一種方式讓我的UWA引用右邊文件,當應用程序爲適當的體系結構(這是我認爲應該發生)。

假設有好歹(或許在winmd文件?)說,「嘿,這是針對不同的CPU架構相同的dll的兩個副本,挑你建立了一個」等只要公共API匹配應用程序只使用正確的?

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

謝謝。

+0

組件提供者似乎可以創建一個正確的WinRT組件; http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2014/05/30/windows-phone-8-1-more-universal-winrt-components.aspx - 在我的情況下,他們沒有。 – Yort

+0

我自己也可以將第三方sdk文件打包爲WinRT擴展(這與編輯csproj文件類似,但在項目中更易於重用); https://開頭MSDN。microsoft.com/en-us/library/jj127117.aspx – Yort

回答

7

有一種方法可以在項目中引用具有不同體系結構的相同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上測試,但它應該以同樣的方式工作。

+0

謝謝,這很有用。我會嘗試一下,看看它是如何爲我工作的。我想我也有第二個問題,在Win10通用應用程序中引用正確的c運行時,所以可能需要一段時間才能看到這是否解決了我的問題。 – Yort