sma*_*man 59 .net c# performance modifier extern
每当我深入了解反射器时,我就会碰到extern
没有光源的方法.我在http://msdn.microsoft.com/en-us/library/e59b22c5(v=vs.80).aspx上阅读了msdn文档.我从那篇文章得到的是extern
必须注入带有修饰符的方法.我将其解释为意味着它的工作方式类似于抽象工厂模式.我也注意到我从未见过非静态的外部方法.静态声明是一个要求(我可以看到这有什么意义)?我还在猜这里,我不确定它是如何运作的.在我看来,编译器必须识别某些缓解处理的属性,但我不知道除了我MethodImplAttribute
和DllImportAttribute
MSDN示例中遇到的属性之外的属性.有人如何利用该extern
属性?它说,在许多情况下,这可以提高性能.另外,我将如何extern
研究类似的方法来源Object.InternalGetEquals()
?
Eri*_*ert 98
请阅读C#规范的第10.6.7节,它解答了许多问题.为了您的方便,我在这里重现了部分内容:
当方法声明包含extern修饰符时,该方法被称为外部方法.外部方法在外部实现,通常使用C#以外的语言.因为外部方法声明没有提供实际的实现,所以外部方法的方法体只包含一个分号.外部方法可能不是通用的.extern修饰符通常与DllImport属性一起使用,允许外部方法由DLL(动态链接库)实现.执行环境可以支持其他机制,由此可以提供外部方法的实现.当外部方法包含DllImport属性时,方法声明还必须包含静态修饰符.
有人如何利用extern属性?
我将如何研究像Object.InternalGetEquals()这样的extern方法的来源?
转到https://github.com/dotnet/coreclr/tree/master/src/vm
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实现,所以一定要检查出来.