2015-11-03 141 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