2015-11-03 62 views
2

我开发了基于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文件,以确保足够的包安装在所有平台上?

回答

3

这可能有助于理解.winmd文件的真正含义。它是旧的COM类型库的重新表述,您可能以前遇到.tlb文件。可能使用OleView.exe SDK实用程序File + View Typelib命令查看了其内容。

与.NET元数据非常相似,您的配置文件表示您以前绝对使用过它们。在C#项目的引用节点中找到的文件。你可能以前用ildasm.exe或反编译器或ILSpy这样的.NET反编译器来查看它们。或者IDE的Go To Declaration命令。你已经知道这样的引用是独立于平台的。

Microsoft已退出.tlb文件格式,并将其替换为.NET元数据文件格式。一种足够灵活的格式来表达COM声明。并且可扩展到足以表示WinRT声明,这种声明不能被强制转换为.tlb格式。像泛型和属性一样,语言投影大量使用,以使COM客户端代码更易于编写。相当好的举动,微软必须做很少的工作来改变现有的工具,比如C#编译器,以处理.winmd文件。

长话短说,它的行为就像编译时的.NET程序集和COM类型库。编译器使用它来检索类型声明。你可以使其平台依意外,如使用int当你打算使用IntPtr。但是,您使用任何语言编程的语言投影都会导致这种罕见的事故。当你测试时很快就会发现。

+0

'winmd'文件不包含代码。例如,您可以通过在VS 2015中构建新的运行时组件来尝试此操作。生成的二进制文件将是一个包含元数据和类实现的单个文件。 – WiredPrairie

+2

只需在... C++运行时组件的.winmd文件只包含元数据。但是,C#运行时组件包含元数据和实现。 – gotomanners