extern如何在C#中工作?

每当我对反射镜看得足够深的时候,我都会碰到extern方法。 我阅读http://msdn.microsoft.com/en-us/library/e59b22c5(v=vs.80).aspx上的msdn文档。 我从那篇文章中得到的结果是,带有extern修饰符的方法必须被注入。 我将其解释为意味着它像抽象工厂模式那样工作。 我也注意到,我从来没有见过非静态的extern方法。 静态声明是一个要求(我可以看到这是如何有意义的)? 我仍然在这里猜测,我不确定它是如何工作的。 在我看来,编译器必须识别某些缓解处理的属性,但我不知道除了我从MSDN示例中看到的MethodImplAttributeDllImportAttribute之外的其他属性。 某人如何利用extern属性? 它说在很多情况下,这可以提高性能。 另外,我将如何去寻找像Object.InternalGetEquals()这样的extern方法的源代码?


考虑阅读C#规范的第10.6.7节,它回答了您的许多问题。 为了您的方便,我在这里再现了部分内容:


当一个方法声明包含一个extern修饰符时,该方法被认为是一种外部方法。 外部方法在外部实现,通常使用C#以外的语言。 因为外部方法声明没有提供实际的实现,所以外部方法的方法体只是由分号组成。 外部方法可能不是通用的。 extern修饰符通常与DllImport属性结合使用,允许通过DLL(动态链接库)实现外部方法。 执行环境可以支持可以提供外部方法的实现的其他机制。 当外部方法包含DllImport属性时,方法声明还必须包含一个静态修饰符。


某人如何利用extern属性?

  • 用您选择的非托管语言编写代码。
  • 将其编译到DLL中,导出代码的入口点。
  • 制作一个互操作库,将该方法定义为给定DLL中的extern方法。
  • 从C#调用它。
  • 利润!
  • 我如何去寻找像Object.InternalGetEquals()这样的extern方法的源代码?

    转到https://github.com/dotnet/coreclr/tree/master/src/vm


    [DllImport]属性标记extern方法通常是对C库的调用。 此功能对调用WinAPI或旧代码很有用。

    这是来自MSDN的示例:

    using System;
    using System.Runtime.InteropServices;
    class MainClass 
    {
       [DllImport("User32.dll")]
       public static extern int MessageBox(int h, string m, string c, int type);
    
       static int Main() 
       {
          string myString; 
          Console.Write("Enter your message: ");
          myString = Console.ReadLine();
          return MessageBox(0, myString, "My Message Box", 0);
       }
    }
    

    它调用Windows user32.dll库中定义的MessageBox 。 运行时为你做了所有繁重的工作,尽管有时你需要手动管理内存。 如果您的签名不正确,您的程序可能会在通话中失败,您可能会引入泄漏,或者该方法可能会返回完全不同的内容,请注意! 我发现pinvoke.net是一个很好的工具来纠正不同API的签名。

    .NET Framework中的某些extern方法没有[DllImport]属性,但用[MethodImpl (MethodImplOptions.InternalCall)]属性修饰,通常是CLR本身实现的,也是用C编写的。 有些这样的方法不能在C#中实现,因为它们自己管理运行时,有些以C语言实现,因为它们的性能非常关键,C更快。

    这是MSDN对他们所说的:

    指定一个内部呼叫。 内部调用是对公共语言运行时本身实现的方法的调用。

    至于看实际的实现代码,我怀疑你可以从微软得到它,但是CLR有一些很酷的替代实现,所以一定要检查一下。


    extern使用平台调用(pinvoke)来方便托管程序集调用非托管代码。 extern关键字通知编译器它将需要生成正确的代码以允许正确的数据封送。

    链接地址: http://www.djcxy.com/p/79187.html

    上一篇: How does extern work in C#?

    下一篇: 32.dll in unsafe c# faster than using .net sockets?