C# внутренний статический экстерн с атрибутом InternalCall - внутренний или внешний?

@reefnet_alex

Вы абсолютно правы - процесс артикулирования, даже если это себе или мягкой игрушке, замечателен для того, чтобы продумать вещи. Лично, я ввожу подобный блогу монолог в файле при попытке разработать что-то. Это имеет добавленную премию способности вернуться к нему, когда я должен.

, Насколько другие стратегии идут, я нахожу, что лучшая вещь сделать состоит в том, чтобы поддержать Список ожидающих выполнения задач. Если я застреваю на одной вещи, я просто перехожу на что-то еще в списке ожидающих выполнения задач.

34
задан Community 23 May 2017 в 12:26
поделиться

2 ответа

Я бы просто прокомментировал сообщение leppie , но оно становилось слишком длинным.

Я В настоящее время я работаю над экспериментальной реализацией интерфейса командной строки. Есть много случаев, когда общедоступный метод (или свойство) не может быть реализован без знания того, как виртуальная машина реализована внутри. Одним из примеров является OffsetToStringData , который требует знания того, как диспетчер памяти выделяет строки.

В таких случаях, когда нет кода C # для выражения метода, вы можете обрабатывать каждый вызов метода в особый путь внутренний к процессу JIT. В качестве примера заменим байт-код вызова на ldc. i4 (целая константа загрузки) перед передачей его генератору машинного кода. Флаг InternalCall означает, что «тело этого метода особым образом обрабатывается самой средой выполнения». Фактическая реализация может быть, а может и не быть - в некоторых случаях в моем коде вызов обрабатывается JIT как внутренний .

Есть и другие случаи, когда JIT может иметь доступную специальную информацию, которая позволяет тяжелая оптимизация метода. Одним из примеров являются методы Math , где, хотя эти могут быть реализованы на C # , указание InternalCall , чтобы сделать их эффективными встроенными функциями, имеет значительные преимущества в производительности.

В C # метод должен иметь тело, если оно не является abstract или extern . extern означает общее: «Вы можете вызвать этот метод из кода C #, но его тело фактически определено в другом месте». Когда JIT достигает вызова метода extern , он ищет, где найти тело, и ведет себя по-разному в зависимости от результата.

  • Атрибут DllImport указывает JIT на необходимость создайте заглушку P / Invoke для вызова реализации нативного кода.
  • Флаг InternalCall указывает JIT обрабатывать вызов самоопределяемым способом.
  • (Есть и другие, но я у меня в голове нет примеров для их использования.)
50
ответ дан 27 November 2019 в 16:40
поделиться

InternalCall означает, что предоставляется фреймворком.

extern сообщает, что вы не предоставляете код.

extern может использоваться в двух общих ситуациях, например выше или с помощью p / invoke.

С помощью p / invoke вы просто указываете методу, где получить реализацию.

17
ответ дан 27 November 2019 в 16:40
поделиться