如果你看看圖,這是鏈接的網站上,它可能更容易理解。
這是否意味着同一個進程中的所有類型都有相同的指向同一個IVMap的指針?
是的,因爲它在域級別,這意味着AppDomain中的所有內容都具有相同的IVMap。
CLR如何知道選擇哪個條目?它是否進行線性搜索來查找與當前類型匹配的條目?或二進制搜索?或者某種直接索引,並有一個可能有很多空條目的地圖?
這些類都是用偏移量來佈局的,所以每個類都有一個相對設置的區域。這使得查找方法更容易。它將搜索IVMap表並從界面中找到該方法。從那裏,它進入MethodSlotTable並使用該類的接口實現。類的接口映射包含元數據,但是,實現與其他方法一樣被處理。
再次從該網站您鏈接:
每個接口的實現將在IVMap的條目。如果MyInterface1由兩個類實現,則IVMap表中將有兩個條目。該項目將重新指向嵌入MyClass的方法表中的子表的開始
這意味着,每一個接口實現的時候它在IVMap唯一的記錄,它指向MethodSlotTable這又指向實施。所以它知道基於調用它的類選擇哪個實現,因爲IVMap記錄指向調用該方法的類中的MethodSlotTable。所以我想這只是通過IVMap進行線性搜索才能找到正確的實例,然後關閉並運行。
編輯:提供更多關於IVMap的信息。
再次,從在OP的鏈接:
前4個字節的第一InterfaceInfo入口點MyInterface1的類型句柄(參見圖9和圖10)的。下一個WORD(2個字節)被Flags佔用(其中0從父類繼承,1在當前類中實現)。 Flags之後的WORD是Start Slot,由類加載器用來佈置接口實現子表。
所以在這裏我們有一個表,其中數字是字節的偏移量。這是IVMap只是一條記錄:
+----------------------------------+
| 0 - InterfaceInfo |
+----------------------------------+
| 4 - Parent |
+----------------------------------+
| 5 - Current Class |
+----------------------------------+
| 6 - Start Slot (2 Bytes) |
+----------------------------------+
假設有這個AppDomain中100分接口的記錄,我們需要找到每一個實施。我們只比較第5個字節,看它是否與我們當前的類匹配,如果是,我們跳到第6個字節中的代碼。因爲,每一個記錄是8個字節長,我們需要做的是這樣的:(僞代碼)
findclass :
if (!position == class)
findclass adjust offset by 8 and try again
雖然它仍然是一個線性搜索,在現實中,它是不會採取這種只要正在迭代的數據大小並不是很大。我希望有所幫助。
EDIT2:
所以看圖表,不知道爲什麼會出現在IVMap爲圖中的類沒有插槽1我重新閱讀部分,發現這個後:
IVMap基於嵌入在方法表中的接口映射信息創建。接口映射是在MethodTable佈局過程中基於類的元數據創建的。一旦類型加載完成,只有IVMap用於方法調度。
因此,類的IVMap只加載了特定類繼承的接口。它看起來像從域IVMap複製,但只保留指向的接口。這引出了另一個問題,如何?可能的是這是C++如何做的vtables其中每個條目具有偏移和接口映射提供了偏移的列表中IVMap以包括等效。
如果我們看一下IVMap這可能是這整個域:
+-------------------------+
| Slot 1 - YourInterface |
+-------------------------+
| Slot 2 - MyInterface |
+-------------------------+
| Slot 3 - MyInterface2 |
+-------------------------+
| Slot 4 - YourInterface2 |
+-------------------------+
假定只有4個接口映射的實現在這一領域。每個插槽將有一個偏移量(類似於IVMap記錄我先前公佈),併爲該類會使用這些偏移訪問記錄在IVMap的IVMap。
假設每個時隙爲8個字節插槽1從0開始,所以如果我們想獲得插槽2和3,我們會做這樣的事:因爲我不是
mov ecx,edi
mov eax, dword ptr [ecx]
mov eax, dword ptr [ecx+08h] ; slot 2
; do stuff with slot 2
mov eax, dword ptr [ecx+10h] ; slot 3
; do stuff with slot 3
請原諒我的x86熟悉它,但我試圖複製它們鏈接到的文章中的內容。從那時起
問題中的鏈接不再指向特定文章。請你能告訴我們該文章出現在(月份和年份)的哪個問題? – buffjape 2015-12-14 14:57:48
@buffjape這是[MSDN magazine](https://msdn.microsoft.com/en-us/magazine/ee310108.aspx)2005年5月刊。我更新了鏈接以指向互聯網存檔。 – Virtlink 2015-12-15 10:05:49
請不要獎勵一個巨大的賞金,即使在發佈的時候,也不相關的嚴重過時的複製粘貼答案。這對任何人都沒有幫助。 – 2016-10-30 12:09:29