从 Windows 10 个跨 CPU 架构的通用应用程序引用 C Dll

Referencing C Dlls from Windows 10 Universal App Across CPU Architectures

基本question/summary:我需要从 Win 10 通用应用程序项目中引用其他人用 C 创建的二进制文件 (dll)。但是,x86 和 arm 有一个单独的 dll。我相信我需要从项目中引用 dll(或至少 winmd 文件)才能部署它,但我只能引用一个文件,不能同时引用两个文件。这意味着该应用程序在一个或另一个平台(桌面或 phone)上失败,因为它包含了错误的二进制文件。正在寻找解决方案。

更详细的解释;

我正在尝试编写通用 Windows 应用程序(新的 Windows 10 样式)。这意味着我有一个项目可以添加对外部组件的引用。

我需要一些图像处理的东西,最好作为第 3 方组件购买,而不是在内部开发。第 3 方提供了多个支持 WinRT 但 none 专门支持 UWA 的 SDK。然而,WinRT SDK 对于 Windows Phone 和 Windows 桌面应用程序都有不同的二进制文件。二进制文件都是从 C/C++ 源创建的。这对较旧的 'universal' 应用程序很好,因为 phone 和桌面有一个单独的项目,因此您可以在每个项目中引用不同的组件,但现在只有一个项目可以添加引用。

我向一家供应商询问了 UWA 支持,他们声称这是不可能的,他们无法创建一个二进制文件来同时针对两个平台(arm vs x86),而且他们不知道我的 UWA 引用为适当的架构构建应用程序时正确的文件(这是我认为应该发生的)。

假设 有某种方式(也许在 winmd 文件中?)说,'嘿,这是不同 CPU 架构的同一个 dll 的两个副本,选择你正在构建的那个',只要 public 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 项目(使它们在 phone 和模拟器上都能工作)。我没有在 Windows 10 和 VS2015 上测试过,但它应该以相同的方式工作。