2014-03-12 93 views

回答

3

你不能。 .winmd文件只包含類型聲明,它不包含代碼。它與COM Automation中使用的類型庫(.tlb)完全等價。與C或C++程序中的.h文件相當的邏輯。

.tlb格式過於嚴格,無法支持WinRT並被重新設計爲.winmd,該文件的格式與.NET元數據相同,您可以使用.NET工具(如ildasm.exe)查看其內容。編譯器使用它來知道如何生成正確的代碼來使用WinRT組件,就像C++編譯器知道如何通過#include包含類聲明的.h文件來使用類庫。

就像.h文件一樣,您需要找出哪些可執行文件實現了這些類型並將其部署到用戶的機器上。除非是Windows.winmd,它是聲明所有內置WinRT類型的那個,否則你會期望二進制組件非常接近.winmd文件。商店要求您將該二進制組件包含在您的包中。如果您需要幫助,請諮詢組件的作者。

+0

感謝漢斯。但是加載器如何知道真正的實現代碼是什麼?回到本地,.lib for .dll只包含諸如「jmp _imp_xxx」之類的指令,並且加載器加載.DLL並更改基地址以確保控制流可以跳轉到真實代碼,這與.winmd非常相似:如果我的代碼調用函數駐留在.winmd,加載程序或操作系統的某些組件應該將控制流重定向到實際代碼,對吧?他們如何找到真正的組裝? – codewarrior

+0

很大的問題。這與免註冊COM的工作方式非常相似。綁定在運行時動態發生,不涉及加載器。 RoCreateInstance()是工廠函數,相當於註冊表是包清單。 –

1

漢斯是非常現貨。一個winmd文件只描述了一個類型的形狀(用於運行時的CLR和JS語言投影以及編譯時的C++編譯器)。在運行時,RoActivateInstance API(或RoGetActivationFactory API)獲取類型名稱並返回實現該類型的對象。

對於應用程序特定類型,程序包清單的ActivatableClassId條目描述了運行時類的實現位置。對於特定於系統的類型,它位於註冊表中,但類型的位置可能在將來隨時更改。

5

免責聲明:這個答案描述無證實現細節,可隨時更改,恕不另行通知。

對於在Windows.winmd中定義的類型或C:\windows\system32\WinMetadata中的任何.winmd,註冊表會指向您實際的實現。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\SystemSettings.DataModel.SettingsDatabase處查找類型名稱,DllPath值將包含實現該類型的DLL。

+0

這個答案要麼是官方文檔的鏈接,要麼是免責聲明,它正在描述未記錄的實現細節(可以隨時更改,恕不另行通知)。 – IInspectable

+0

好吧,對不起,沒有免責聲明,這個答案是危險的。-1,我擔心,特別是**受支持的** API已經出來,並且已經發布在一個答案中(http://stackoverflow.com/a/22369178/1889329)近半年時間了。令人遺憾的是,自從你聲稱爲那些需要使用未公開的接口修復應用程序的公司工作以來,就更是如此。 – IInspectable

+0

我的回答補充了以前的答案。添加免責聲明是有道理的,謝謝! – kiewic

相關問題