我有問題,給一個.winmd文件,我們在哪裏可以找到真正的實現是? .winmd文件就像一個頭文件或動態庫的.lib文件,它不包含任何實現,我好奇它的實現在哪裏。 謝謝。鑑於.winmd文件,我們在哪裏可以找到真正的實現DLL?
回答
你不能。 .winmd文件只包含類型聲明,它不包含代碼。它與COM Automation中使用的類型庫(.tlb)完全等價。與C或C++程序中的.h文件相當的邏輯。
.tlb格式過於嚴格,無法支持WinRT並被重新設計爲.winmd,該文件的格式與.NET元數據相同,您可以使用.NET工具(如ildasm.exe)查看其內容。編譯器使用它來知道如何生成正確的代碼來使用WinRT組件,就像C++編譯器知道如何通過#include包含類聲明的.h文件來使用類庫。
就像.h文件一樣,您需要找出哪些可執行文件實現了這些類型並將其部署到用戶的機器上。除非是Windows.winmd,它是聲明所有內置WinRT類型的那個,否則你會期望二進制組件非常接近.winmd文件。商店要求您將該二進制組件包含在您的包中。如果您需要幫助,請諮詢組件的作者。
感謝漢斯。但是加載器如何知道真正的實現代碼是什麼?回到本地,.lib for .dll只包含諸如「jmp _imp_xxx」之類的指令,並且加載器加載.DLL並更改基地址以確保控制流可以跳轉到真實代碼,這與.winmd非常相似:如果我的代碼調用函數駐留在.winmd,加載程序或操作系統的某些組件應該將控制流重定向到實際代碼,對吧?他們如何找到真正的組裝? – codewarrior
很大的問題。這與免註冊COM的工作方式非常相似。綁定在運行時動態發生,不涉及加載器。 RoCreateInstance()是工廠函數,相當於註冊表是包清單。 –
漢斯是非常現貨。一個winmd文件只描述了一個類型的形狀(用於運行時的CLR和JS語言投影以及編譯時的C++編譯器)。在運行時,RoActivateInstance API(或RoGetActivationFactory API)獲取類型名稱並返回實現該類型的對象。
對於應用程序特定類型,程序包清單的ActivatableClassId條目描述了運行時類的實現位置。對於特定於系統的類型,它位於註冊表中,但類型的位置可能在將來隨時更改。
免責聲明:這個答案描述無證實現細節,可隨時更改,恕不另行通知。
對於在Windows.winmd中定義的類型或C:\windows\system32\WinMetadata
中的任何.winmd,註冊表會指向您實際的實現。
在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\SystemSettings.DataModel.SettingsDatabase
處查找類型名稱,DllPath
值將包含實現該類型的DLL。
這個答案要麼是官方文檔的鏈接,要麼是免責聲明,它正在描述未記錄的實現細節(可以隨時更改,恕不另行通知)。 – IInspectable
好吧,對不起,沒有免責聲明,這個答案是危險的。-1,我擔心,特別是**受支持的** API已經出來,並且已經發布在一個答案中(http://stackoverflow.com/a/22369178/1889329)近半年時間了。令人遺憾的是,自從你聲稱爲那些需要使用未公開的接口修復應用程序的公司工作以來,就更是如此。 – IInspectable
我的回答補充了以前的答案。添加免責聲明是有道理的,謝謝! – kiewic
- 1. 我在哪裏可以找到真實的FFT和iFFT實現?
- 2. 我在哪裏可以找到System.Linq.Dynamic dll?
- 3. 我在哪裏可以找到System.Web.HttpContext.Current.Server dll?
- 4. 我在哪裏可以找到真正的arm-none-linux-gnueabi?
- 5. 在哪裏可以找到System.management的DLL
- 6. 哪裏可以找到tf.image.resize_bicubic的實現?
- 7. 哪裏可以找到「time.h」的實現?
- 8. 哪裏可以找到stdio.h的實現?
- 9. 我在哪裏可以找到Matroska容器「真實」規格?
- 10. 在哪裏可以找到COM DLL?
- 11. @dynamic實現哪裏可以找到它?
- 12. 我在哪裏可以找到關於IOCDS文件的信息?
- 13. Tizen:我們在哪裏可以找到Tizen :: Ui :: SystemUtil :: GenerateKeyEvent的實現代碼?
- 14. 我在哪裏可以找到Oracle實驗室文件?
- 15. 我在哪裏可以找到Visual Studio中stdio.h的實現?
- 16. 我在哪裏可以找到實現Zend_Auth的最佳方式?
- 17. 我在哪裏可以找到Android中API的實現?
- 18. 我在哪裏可以找到Lucene的通配符實現?
- 19. 我在哪裏可以找到高效的R-Tree實現?
- 20. 我在哪裏可以找到std :: string的實現
- 21. 我可以在哪裏找到Hadoop上的SVM實現?
- 22. 我在哪裏可以找到Java EL 3.0的實現
- 23. 我在哪裏可以找到WS-Trust的U-Prove實現?
- 24. 我在哪裏可以找到laravel auth facade類的實現
- 25. 我在哪裏可以找到jquery.param的實現代碼?
- 26. 我在哪裏可以找到atof的.net實現?
- 27. 我在哪裏可以找到JavaScript函數的實現?
- 28. 我在哪裏可以找到Visual Studio的C99數學實現?
- 29. 我在哪裏可以找到javax.validation的實現。*?
- 30. Git - 我在哪裏可以找到實現.gitignore的源代碼
爲什麼你需要知道問題的答案?這是好奇心還是你有技術需要的答案? –