Windows runtime .winmd文件是否独立于平台?

Windows runtime .winmd文件是否独立于平台?,windows-runtime,nuget,win-universal-app,Windows Runtime,Nuget,Win Universal App,我已经为UniversalWindows开发了一个基于C/C++的Windows运行时组件,现在我正试图将其包含在NuGet plackage中 在NuGet版本3中,引入了runtimes文件夹,有关详细信息,请参阅。不幸的是,本文档没有提供有关如何处理Windows运行时组件的详细信息 我将NuGet包中的文件组织为: └───MyNuGetPackage ├───lib │ └───uap │ MyRuntimeLibrary.

我已经为UniversalWindows开发了一个基于C/C++的Windows运行时组件,现在我正试图将其包含在NuGet plackage中

在NuGet版本3中,引入了runtimes文件夹,有关详细信息,请参阅。不幸的是,本文档没有提供有关如何处理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  
     └───runtimes  
         ├───win10-x86  
         │   └───lib  
         │       └───uap  
         │             MyRuntimeLibrary.winmd  
         │   └───native  
         │         MyRuntimeLibrary.dll  
MyNuGetPackage.targets文件在生成过程中用于添加对.winmd文件的引用,并显式指定实现.dll:

我已经相应地更新了MyNuGetPackage.targets文件。但是,当我安装此替代NuGet软件包并尝试为特定平台构建时,我收到一个有效负载构建错误,即MyRuntimeLibrary.winmd文件正在从两个单独的位置复制到输出目录,即lib\uap文件夹和runtimes子文件夹

完全排除顶级lib\uap文件夹也无济于事;如果我这样做,构建过程根本找不到任何.winmd文件引用


如果.winmd文件毕竟依赖于平台,那么我应该如何组织NuGet包中的.winmd和.dll文件,以确保包在所有平台上都能充分安装?

了解.winmd文件的真正含义可能会有所帮助。它是旧的COM类型库的重新格式化,您以前可能遇到过.tlb文件。以前可能使用OleView.exe SDK实用程序File+View Typelib命令查看过它的内容

与.NET元数据非常相似,您的个人资料显示您以前肯定使用过它们。在C项目的“引用”节点中找到的文件。您以前可能已经使用ildasm.exe或.NET反编译器(如Reflector或ILSpy)查看过它们。或者IDE的Go To Declaration命令。您已经知道,此类引用与平台无关

Microsoft取消了.tlb文件格式,并将其替换为.NET元数据文件格式。一种足够灵活的格式,可以表达COM声明。并且可以扩展到足以表达WinRT声明,这种声明不能被转换成.tlb格式。与泛型和属性一样,语言投影也大量使用它们,使COM客户端代码更易于编写。这一举措相当不错,微软只需做很少的工作就可以改变现有的工具,比如C编译器,来处理.winmd文件


长话短说,它在编译时的行为就像.NET程序集和COM类型库。编译器使用它来检索类型声明。您可能会意外地使它依赖于平台,比如在打算使用IntPtr时使用int。但是无论你用什么语言编程,你都会使用语言投射,这是一个非常罕见的意外。并在测试时迅速发现。

winmd文件从不包含代码不是真的。例如,您可以通过在VS2015中构建一个新的运行时组件来尝试这一点。生成的二进制文件将是一个包含元数据和类实现的单个文件。只是在……C++运行库组件中嵌套。WIMD文件只包含元数据。然而,C运行时组件确实包含元数据和实现。
     └───runtimes  
         ├───win10-x86  
         │   └───lib  
         │       └───uap  
         │             MyRuntimeLibrary.winmd  
         │   └───native  
         │         MyRuntimeLibrary.dll