代码之家  ›  专栏  ›  技术社区  ›  CraigTP

C#具有InternalCall属性的内部静态外部-内部还是外部?

  •  33
  • CraigTP  · 技术社区  · 17 年前

    another question Array.Copy 方法使用非托管代码。我和他一起去挖 Reflector 并在一个

    [MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
    internal static extern void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable);
    

    看了这个,我有点困惑。我困惑的根源是 extern 修饰语,意思是( MSDN 链接):

    extern修饰符用于声明 实现的方法 外部。

    但是,方法声明也用 MethodImplOptions.InternalCall MSDN 链接):

    这是在公共系统中实现的 语言运行库本身。

    2 回复  |  直到 9 年前
        1
  •  55
  •   Community Mohan Dere    9 年前

    我只会评论一下 leppie's 发帖,但是有点长了。

    我目前正在开发一个实验性的CLI实现。在许多情况下,如果不知道虚拟机如何在内部实现,就无法实现公开的方法(或属性)。一个例子是 OffsetToStringData ,这需要了解内存管理器如何分配字符串。

    内部的 到JIT过程。例如,替换 call ldc.i4 (加载常量整数),然后将其传递给本机代码生成器。这个 InternalCall flag表示“此方法的主体由运行时本身以特殊方式处理”。可能有也可能没有实际的实现——在我的代码中,有几种情况下,调用被视为 intrinsic 准时制。

    Math 方法,即使这些 can be implemented in C# ,指明 内部通话

    abstract extern . 这个 表示一个通用的“您可以从C#代码调用此方法,但它的主体实际上是在其他地方定义的。”。当JIT调用 外行 方法时,它会查找查找主体的位置,并根据结果以不同的方式进行操作。

    • 这个 DllImport 属性指示JIT生成P/Invoke存根以调用本机代码实现。
    • 这个
    • (还有其他一些例子,但我没有现成的例子来使用。)
        2
  •  19
  •   leppie    17 年前

    InternalCall 框架提供的手段。

    extern 表示您没有提供代码。

    可以在2种一般情况下使用,如上面所述,或与p/invoke一起使用。

    使用p/invoke,您只需告诉方法从何处获取实现。