基本问题/总结:我需要引用一个二进制(dll),这个二进制(dll)是别人用C语言从一个Win10通用应用程序项目中创建的。但是,x86和ARM有一个单独的dll。我相信我需要从项目中引用dll(或者至少是winmd文件)来部署它,但是我只能引用一个文件而不能同时引用两个文件。这意味着应用程序在一个或另一个平台(桌面或电话)上失败,因为它包含了错误的二进制代码。寻找解决方案。
更详细的解释;
我正在尝试编写一个通用的Windows应用程序(新的Windows10样式)。这意味着我只有一个项目要添加对外部组件的引用。
我需要一些图像处理的东西,最好买作为一个第三方组件,而不是在家里开发。第三方提供了几个支持WinRT的SDK,但没有专门支持UWA的SDK。但是,WinRT SDK对于Windows Phone和Windows桌面应用程序都有不同的二进制文件。二进制文件都是从C/C++源创建的。以前的“通用”应用程序没有问题,因为手机和桌面都有一个单独的项目,所以你可以在每个项目中引用不同的组件,但是现在只有一个项目可以添加引用。
我问过一个供应商关于UWA的支持,他们声称这是不可能的,他们不能创建一个单一的二进制文件来针对两个平台(arm vs x86),而且他们不知道如何让我的UWA在为合适的架构构建应用程序时引用合适的文件(这是我认为应该发生的)。
我假设有某种方法(也许在winmd文件中?)如果说,‘嘿,这里有两个相同dll的副本,用于不同的CPU架构,选择您正在构建的那个’,那么只要公共API匹配,应用程序就会使用正确的那个?
对此有没有解决办法?有人知道这种参考应该如何工作吗?还是我运气不好?
谢了。
null
在您的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项目(使它们在手机和仿真器上都能工作)。我没有在Windows10和VS2015上测试过,但它应该是一样的工作方式。