Методы, отмеченные 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);
}
}
Он вызывает MessageBox
, который определен в библиотеке Windows user32.dll
. Runtime выполняет всю тяжелую работу за вас, хотя иногда вам придется вручную управлять памятью. Если вы ошиблись в подписи, ваша программа может перестать работать при вызове, вы можете ввести утечку или метод может вернуть что-то совершенно другое, поэтому будьте осторожны! Я считаю pinvoke.net отличным инструментом для исправления подписей для различных API.
Некоторые extern
методы внутри .NET Framework, которые не имеют атрибута [DllImport]
, но украшены атрибутом [MethodImpl (MethodImplOptions.InternalCall)]
, обычно являются теми, которые реализованы в самой CLR. , который также написан на C. Некоторые из таких методов просто не могут быть реализованы в C #, потому что они сами управляют временем выполнения, а некоторые реализуются в C, потому что их производительность критична и C быстрее.
Вот что MSDN говорит о них:
Указывает внутренний вызов. Внутренний вызов - это вызов метода, который реализован в самой общеязыковой среде выполнения.
Что касается фактического кода реализации, я сомневаюсь, что вы сможете получить его от Microsoft, но есть несколько классных альтернативных реализаций CLR около , поэтому обязательно ознакомьтесь с ними.