我开发了基于C/C++的Windows运行时组件对于通用Windows,我现在试图将它包含在NuGet plackage中。.winmd文件平台是独立的吗?
对于NuGet版本3,运行时间文件夹已被引入,详见here。不幸的是,本文档没有提供关于如何处理Windows运行时组件的更多信息。
我安排在NuGet包中的文件是这样的:
└───MyNuGetPackage
├───lib
│ └───uap
│ MyRuntimeLibrary.winmd
│
├───build
│ └───uap
│ MyNuGetPackage.targets
│
└───runtimes
├───win10-x86
│ └───native
│ MyRuntimeLibrary.dll
│
├───win10-x64
│ └───native
│ MyRuntimeLibrary.dll
│
└───win10-arm
└───native
MyRuntimeLibrary.dll
的MyNuGetPackage.targets文件的生成过程中使用的引用添加到.winmd文件,并明确指定实施.dll文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="InjectReference" BeforeTargets="ResolveAssemblyReferences">
<ItemGroup Condition=" '$(Platform)' == 'x86' or '$(Platform)' == 'x64' or '$(Platform)' == 'ARM'">
<Reference Include="Dicom.Imaging.Codec">
<HintPath>$(MSBuildThisFileDirectory)..\..\lib\uap\MyRuntimeLibrary.winmd</HintPath>
<Implementation>MyRuntimeLibrary.dll</Implementation>
</Reference>
</ItemGroup>
</Target>
</Project>
据我已经能够告诉,这个NuGet包compositio n有效;建立了不同平台,和ARM当相关实现文件被选中。
然而,上述办法,我只包括一个目标平台(在这种特定情况下).winmd文件。 这真的好吗?这似乎工作,但真的是.winmd文件平台独立?
万一.winmd文件是平台依赖,我尝试添加特定.winmd文件平台的目标下运行时文件夹,如:
└───runtimes
├───win10-x86
│ └───lib
│ └───uap
│ MyRuntimeLibrary.winmd
│ └───native
│ MyRuntimeLibrary.dll
和我相应地更新了MyNuGetPackage.targets文件。然而,当我安装这种替代NuGet包,并尝试建立针对特定平台,我得到一个有效载荷生成错误的MyRuntimeLibrary.winmd文件正被复制到输出目录从两个不同的位置,无论是的lib \ UAP文件夹和运行时间子文件夹。
这也无助于排除顶部的lib \ uap文件夹;如果我这样做,构建过程根本找不到任何.winmd文件引用。
如果.winmd文件是依赖于平台毕竟,我应该怎么安排我的NuGet包的.winmd和.DLL文件,以确保足够的包安装在所有平台上?
'winmd'文件不包含代码。例如,您可以通过在VS 2015中构建新的运行时组件来尝试此操作。生成的二进制文件将是一个包含元数据和类实现的单个文件。 – WiredPrairie
只需在... C++运行时组件的.winmd文件只包含元数据。但是,C#运行时组件包含元数据和实现。 – gotomanners