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



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

774   4  

4 ответов:

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


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

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

вот что такое MSDN говорит о них:

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

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

extern is с вызовом платформы (pinvoke) для облегчения управляемых сборок, вызывающих в неуправляемый код. Элемент 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);

Comments

    Ничего не найдено.