.net - 跨 CPU 架构从 Windows 10 通用应用程序引用 C Dll

标签 .net c windows-runtime win-universal-app windows-10

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

更详细的解释;

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

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

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

假设有某种方式(也许在 winmd 文件中?)说,'嘿,这是用于不同 CPU 架构的相同 dll 的两个副本,选择你正在构建的那个'只要公共(public) API 与应用程序匹配就可以使用正确的 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 上测试过,但它应该以相同的方式工作。

关于.net - 跨 CPU 架构从 Windows 10 通用应用程序引用 C Dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30971006/

相关文章:

c - 文件系统统计

c - 使用 goto 跳过范围变量初始化不会产生所需的输出

c - 在 c 中设置自定义日期的问题

c# - 如何在没有我的 WPF 主机的情况下启动具有管理员权限的进程也以管理员权限运行以实现文件拖放?

.net - 为什么此 DataAdapter 不将行插入数据库?

c# - 扩展无构造函数类

c# - 什么时候int?和 Nullable<int> 是相同的,为什么它们的行为方式不同?

c# - 弹出按钮更改页面的主题

c# - 将 Google Drive .NET API 与 UWP 应用程序结合使用

c# - 从 ItemsControl 中的代码隐藏获取转换属性的绑定(bind)