如何查找.NET的extern源代码?

问题描述:

我想回答this问题和想法我会看看Array源代码的内部,看看它是如何实现的。因此,我查看了CreateInstance方法的in .NET source code,发现它调用了一个外部方法,其主体是分号并在别处实现。这里是什么样子:如何查找.NET的extern源代码?

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

问:

如何找到其中对于上述外部方法的实现?

找到任何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可能会随着时间推移发生分歧,但现在已经足够了。 –