首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.winmd文件平台是独立的吗?

.winmd文件平台是独立的吗?
EN

Stack Overflow用户
提问于 2015-11-03 09:47:55
回答 1查看 948关注 0票数 2

我已经为通用Windows开发了一个基于C/C++的Windows组件,现在我正在尝试将它包含在一个NuGet包中。

对于NuGet版本3,已经引入了运行时文件夹,有关详细信息,请参阅这里。不幸的是,这个文档没有给出很多关于如何处理_Windows运行时Component_s的信息。

我将NuGet包中的文件组织如下:

代码语言:javascript
复制
└───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。

代码语言:javascript
复制
<?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包组合可以工作;在为不同平台构建x86、x64和ARM时,会选择相关的实现文件。

但是,使用上述方法,我只包含来自一个目标平台的.winmd文件(在本例中为x86)。这真的可以吗?看起来很好,但是.winmd文件平台真的是独立的吗?

如果.winmd文件依赖于平台,我尝试在运行时文件夹下添加特定于平台的.winmd文件,如下所示:

代码语言:javascript
复制
     └───runtimes  
         ├───win10-x86  
         │   └───lib  
         │       └───uap  
         │             MyRuntimeLibrary.winmd  
         │   └───native  
         │         MyRuntimeLibrary.dll  

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-03 10:51:18

它可能有助于理解.winmd文件的真正含义。它是旧式COM类型库的重新表示,您以前可能遇到过一个.tlb文件。可能在使用OleView.exe SDK实用工具文件+视图Typelib命令之前查看过它的内容。

就像.NET元数据一样,您的配置文件显示您以前确实使用过它们。您在C#项目的References节点中找到的文件。您可能在使用ildasm.exe或.NET反编译器(如Reflector或ILSpy )之前查看过它们。或者IDE的“去声明”命令。您已经知道,此类引用与平台无关。

微软取消了.tlb文件格式,代之以.NET元数据文件格式。一种足够灵活的格式,可以表示COM声明。并且具有足够的可扩展性来表示WinRT声明,这类声明不能被敲成.tlb格式。与泛型和属性一样,语言投影大量使用COM客户端代码,使其更易于编写。不错的一步,微软几乎不需要做太多的工作来改变现有的工具,比如C#编译器,来处理.winmd文件。

长话短说,它的行为就像编译时的.NET程序集和COM类型库.编译器使用它来检索类型声明。您可以意外地使其依赖于平台,比如当您打算使用int时使用IntPtr。但是你在任何语言中使用的语言投影使得这是一个非常罕见的意外。当你测试的时候很快就发现。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33495908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档