2015-06-22 56 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