外部如何在C#中工作?

sma*_*man 59 .net c# performance modifier extern

每当我深入了解反射器时,我就会碰到extern没有光源的方法.我在http://msdn.microsoft.com/en-us/library/e59b22c5(v=vs.80).aspx上阅读了msdn文档.我从那篇文章得到的是extern必须注入带有修饰符的方法.我将其解释为意味着它的工作方式类似于抽象工厂模式.我也注意到我从未见过非静态的外部方法.静态声明是一个要求(我可以看到这有什么意义)?我还在猜这里,我不确定它是如何运作的.在我看来,编译器必须识别某些缓解处理的属性,但我不知道除了我MethodImplAttributeDllImportAttributeMSDN示例中遇到的属性之外的属性.有人如何利用该extern属性?它说,在许多情况下,这可以提高性能.另外,我将如何extern研究类似的方法来源Object.InternalGetEquals()

Eri*_*ert 98

请阅读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

  • 很棒的答案,你让我笑了 (10认同)
  • 对于像我这样的凡人来说,SSLI20源代码仍然是内部方法的非常精确的副本.无论如何,足以回答一堆CLR问题.查看clr/src/vm/ecall.cpp,了解从框架名称到C++函数的映射.下载在这里:http://www.microsoft.com/downloads/en/details.aspx?FamilyId = 8C09FD61-3F26-4555 -AE17-3121B4F51D4D&displaylang = en (6认同)
  • @Hans:请注意,在查看SSCLI后,您不能参与Mono项目. (2认同)

Dan*_*mov 30

extern[DllImport]属性的方法通常是对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);
   }
}
Run Code Online (Sandbox Code Playgroud)

它调用MessageBox在Windows user32.dll库中定义的内容.运行时在这里为您完成所有繁重的工作,尽管有时您需要手动管理内存.如果您的签名错误,您的程序可能会失败,您可能会引入泄漏或方法可能返回完全不同的东西,所以要小心!我发现pinvoke.net是一个很好的工具来纠正不同API的签名.

extern.NET Framework中没有[DllImport]属性但用[MethodImpl (MethodImplOptions.InternalCall)]属性修饰的一些方法通常是在CLR本身中实现的,也是用C语言编写的.有些此类方法无法在C#中实现,因为它们管理运行时本身,而有些则在C中实现,因为它们的性能至关重要且C更快.

这就是MSDN 对它们所说的:

指定内部调用.内部调用是对在公共语言运行时本身内实现的方法的调用.

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