2017-04-24 58 views
1

我想回答this問題和想法我會看看Array源代碼的內部,看看它是如何實現的。因此,我查看了CreateInstance方法的in .NET source code,發現它調用了一個外部方法,其主體是分號並在別處實現。這裏是什麼樣子:如何查找.NET的extern源代碼?

private unsafe static extern Array 
    InternalCreate(void* elementType,int rank,int *pLengths,int *pLowerBounds); 

問:

如何找到其中對於上述外部方法的實現?

回答

2

找到任何extern方法的源代碼,請執行下列操作:

  1. 找到extern方法的名稱。在我的情況下,它是InternalCreate
  2. here並找到方法到外部方法的映射。在我的情況下,我需要找到InternalCreate,這裏是映射的樣子。類的名稱爲ArrayNative和方法是CreateInstance

    FCFuncElement("InternalCreate", ArrayNative::CreateInstance) 
    
  3. 找到映射類here。在我的情況下,我需要arraynative,我需要的方法CreateInstance。實現就在那裏,我在這裏複製,但爲了簡便起見去除身體:

    FCIMPL4(Object*, ArrayNative::CreateInstance, 
        void* elementTypeHandle, INT32 rank, INT32* pLengths, INT32* pLowerBounds) 
    { 
        //... 
    } 
    

在那裏你會找到的實施和研究代碼。

+3

一個小記錄,那些鏈接是爲.NET Core運行時。完整.NET框架使用的運行時可能與'dotnet/coreclr'回購中顯示的代碼不同,例如,可能在http://referencesource.microsoft中使用CLR中的本機類型.com /那不在覈心CLR中(不是我所知道的)。一個可能的解決方法是,使用https://source.dot.net/代替執行初始瀏覽,以便看到.NET Core的外部依賴關係,而不是完整的.NET框架。 –

+0

@ScottChamberlain感謝您的注意 - 我甚至沒有意識到這是我在看的.NET Core Runtime。你能否詳細說明你的解決方法?如果我想將解決方法放在我的答案中,它會採取什麼措施? – CodingYoshi

+0

沒關係,他們爲CLR的完整版本和核心版本維護相同的代碼庫。只需一堆#ifdefs即可關閉功能。這可能永遠不會是真的,coreclr可能會隨着時間推移發生分歧,但現在已經足夠了。 –