从 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 上测试过,但它应该以相同的方式工作。
基本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 上测试过,但它应该以相同的方式工作。