Как работает extern в C#?

всякий раз, когда я смотрю достаточно глубоко в отражатель, я натыкаюсь на extern методы без источника. Я прочитал документацию msdn вhttp://msdn.microsoft.com/en-us/library/e59b22c5 (v=против 80).aspx. То, что я получил из этой статьи, - это методы с extern модификатор должен быть введен. Я интерпретировал это так, что это работает что-то вроде абстрактного фабричного шаблона. Я также заметил, что никогда не видел нестатического метода extern. Статическое требование (я мог видеть, как это будет иметь смысл)? Я все еще тут и я не уверен, как это работает. Мне кажется, что компилятор должен распознавать определенные атрибуты, которые смягчают обработку, но я не знаю, какие атрибуты отличаются от тех, с которыми я столкнулся, как MethodImplAttribute и DllImportAttribute из примера MSDN. Как кто-то использует ? Он сказал, что во многих случаях это может увеличить производительность. Кроме того, как бы я стал искать источник extern методы Object.InternalGetEquals()?

4 ответов


рассмотрите раздел 10.6.7 спецификации C#, который отвечает на многие Ваши вопросы. Я воспроизвожу часть его здесь для вашего удобства:


когда объявление метода включает Экстерн модификатор, что способ это сказал быть внешним методом. Внешний методы реализуются извне, обычно используется язык, отличный от С.# Потому что внешний метод декларация не содержит фактических данных реализации метод-тело внешний метод просто состоит из точка с запятой. Внешний метод не может будь общим. Модификатор extern является обычно используется в сочетании с Атрибут DllImport , разрешая внешних методов реализовано DLL (динамическая ссылка Библиотеки.) Среда выполнения может поддерживать другие механизмы, реализация внешних методов могут предоставлять. Когда внешний метод включает атрибут DllImport, объявление метода также должно включить статический модификатор.


Как кто-то использует атрибут extern?

  • писать код в неуправляемом языке.
  • скомпилируйте его в DLL, экспортируя точку входа вашего кода.
  • создайте библиотеку взаимодействия, которая определяет метод как метод extern в данной DLL.
  • позвоните с C#.
  • профит!

Как бы я идти о поиске источника внешних методов, таких как Object.InternalGetEquals ()?

на https://github.com/dotnet/coreclr/tree/master/src/vm


методы, помеченные 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 библиотека. Среда выполнения выполняет всю тяжелую работу для вас здесь, хотя иногда вам нужно вручную управлять памятью. Если вы получите подпись неправильно, ваша программа может потерпеть неудачу при вызове, вы можете ввести утечку или метод может вернуть что-то совершенно другое, поэтому будьте осторожны! Я нахожу pinvoke.net отличный инструмент для исправления подписей для различных API.

некоторые extern методы внутри .NET Framework, которые не имеют [DllImport] атрибут, но украшены [MethodImpl (MethodImplOptions.InternalCall)] атрибут, как правило, те, которые реализованы в самой среде CLR, которая также написана на C. Некоторые из таких методов просто не могут быть реализовано в C#, потому что они управляют самой средой выполнения, а некоторые реализованы в C, потому что их производительность критична, а C быстрее.

это то, что MSDN говорит о них:

указывает внутренний вызов. Внутренний вызов-это вызов метода,реализованного в самой среде выполнения common language.

Что касается фактического кода реализации, я сомневаюсь, что вы сможете получить его от Microsoft но есть некоторые интересные альтернативные реализации CLR вокруг поэтому обязательно проверьте их.


extern с вызовом платформы (pinvoke) для облегчения вызова управляемых сборок в неуправляемый код. The extern ключевое слово сообщает компилятору, что ему нужно будет сгенерировать правильный код для обеспечения правильного маршалинга данных.


мы используем модификатор "extern" в объявлении метода. Он используется для указания на то, что метод реализован извне. Модификатор extern обычно используется с атрибутом DllImport. Вызовы функций, отличных от C#, управляются с помощью этого атрибута. Если вы используете модификатор extern, вы должны включить следующее пространство имен:

using System.Runtime.InteropServices;

синтаксис-это что-то вроде:

[DllImport("User32.dll")] public static extern int MessageBox(int h, string m, string c, int type);