Как скомпилировать приложение.NET в собственный код?

tl; dr: Нет! Функции стрелок и декларации функций / выражения не являются эквивалентными и не могут быть заменены вслепую. Если функция, которую вы хотите заменить, not использует this, arguments и не вызывается с new, тогда да.


Как это часто бывает: это зависит. Функции Arrow имеют другое поведение, чем декларации / выражения функций, поэтому давайте сначала рассмотрим различия:

1. Функции Lexical this и arguments

не имеют собственных привязок this или arguments. Вместо этого эти идентификаторы разрешаются в лексической области, как и любая другая переменная. Это означает, что внутри функции стрелки this и arguments относятся к значениям this и arguments в окружающей среде, функция стрелки определена в (т.е. «снаружи» стрелка )

В случае выражения функции, this относится к объекту, который был создан внутри createObject. В функциональном случае стрелки this относится к this самого createObject.

Это делает функции стрелок полезными, если вам нужно получить доступ к this текущей среды:

// currently common pattern
var that = this;
getData(function(data) {
  that.data = data;
});

// better alternative with arrow functions
getData(data => {
  this.data = data;
});

Обратите внимание, что это также означает, что не можно установить функцию стрелки this с .bind или .call.

Если вы не очень знакомы с this, рассмотрим чтение

2. Функции стрелок не могут быть вызваны с помощью new

ES2015 различает функции, доступные call , и функции, которые являются конструкцией . Если функция конструируется, ее можно вызвать с помощью new, то есть new User(). Если функция является вызываемой, ее можно вызвать без new (т. Е. Вызов нормальной функции).

Функции, созданные посредством деклараций / выражений функций, являются конструктивными и вызываемыми. Функции стрелок (и методы) являются только вызываемыми. class конструкторы только конструктивны.

Если вы пытаетесь вызвать функцию, не вызываемую вызовом, или построить неконструируемую функцию, вы получите ошибку времени выполнения.


Зная это, мы можем указать следующее.

Сменный:

  • Функции, которые не используют this или arguments.
  • Функции, которые используются с .bind(this)

Не сменный:

  • Функции конструктора
  • Функция / методы, добавленные к прототипу (поскольку они обычно используют функции this)
  • Variadic (если они используют arguments (см. ниже))

Давайте рассмотрим это более подробно с помощью ваших примеров:

Функция конструктора

Это не будет работать, потому что функции стрелок нельзя вызвать с помощью new. Продолжайте использовать объявление / выражение функции или используйте class.

Способы прототипа

Скорее всего нет, потому что методы прототипа обычно используют this для доступа к экземпляру. Если они не используют this, вы можете его заменить. Однако, если вы в первую очередь заботитесь о сжатом синтаксисе, используйте class с его синтаксисом сжатого метода:

class User {
  constructor(name) {
    this.name = name;
  }

  getName() {
    return this.name;
  }
}

Методы объекта

Аналогично для методов в объектном литерале. Если метод хочет ссылаться на сам объект через this, продолжайте использовать функциональные выражения или используйте новый синтаксис метода:

const obj = {
  getName() {
    // ...
  },
};

Обратные вызовы

Это зависит. Вы должны обязательно заменить его, если вы наложили внешний this или используете .bind(this):

// old
setTimeout(function() {
  // ...
}.bind(this), 500);

// new
setTimeout(() => {
  // ...
}, 500);

Но: Если код, вызывающий обратный вызов, явно устанавливает this на определенное значение , как это часто бывает с обработчиками событий, особенно с jQuery, и обратный вызов использует this (или arguments), вы не можете использовать функцию стрелки!

Variadic функции

Поскольку функции стрелок не имеют собственных arguments, вы не можете просто заменить их функцией стрелки. Однако ES2015 вводит альтернативу использованию arguments: параметр rest .

// old
function sum() {
  let args = [].slice.call(arguments);
  // ...
}

// new
const sum = (...args) => {
  // ...
};

Связанный вопрос:

Дополнительные ресурсы:

85
задан shA.t 15 April 2015 в 04:39
поделиться

7 ответов

Microsoft имеет статью, описывающую, как Вы можете MSIL Компиляции к Собственному коду

, который можно использовать Ngen.

Собственный Генератор Изображения (Ngen.exe) является инструментом, который улучшает производительность управляемых приложений. Ngen.exe создает собственные изображения, которые являются файлами, содержащими, скомпилировал определенный для процессора машинный код и устанавливает их в собственный кэш изображений на локальном компьютере. Время выполнения может использовать собственные изображения от кэша вместо этого с помощью своевременного (JIT) компилятора для компиляции исходного блока.

, К сожалению, Вам все еще нужны библиотеки от платформы для запущения программы. Нет никакой функции, о которой я знаю с MS.Net SDK платформы, который позволяет Вам компилировать все необходимые файлы в единственный исполняемый файл

43
ответ дан Espo 24 November 2019 в 08:19
поделиться

RemoteSoft делает инструмент, который компилирует приложение.NET в пакет, который может быть выполнен без установленной.NET. У меня нет опыта с ним:

Саламандра RemoteSoft

23
ответ дан Simon Steele 24 November 2019 в 08:19
поделиться

Я протестировал несколько из них и в данный момент единственного, который поддерживает.NET 3.5 и также имеет большой стек виртуализации, Постсборка Xenocode

С ngen, все еще необходимо было установить платформу.NET, но использование инструмента как такового, весь управляемый код компилируется в собственный код, таким образом, можно развернуть его на машинах без присутствия платформы.

19
ответ дан Erick Sgarbi 24 November 2019 в 08:19
поделиться

Да, с помощью Ngen, Собственный Генератор Изображения. Существуют, однако, много вещей, о которых необходимо знать:

  • Вам все еще нужен CLR для выполнения исполняемого файла.
  • CLR динамично не оптимизирует Ваши блоки на основе среды, это выполняется в (например, 486 по сравнению с 586 по сравнению с 686, и т.д.)

, В целом, только стоит использовать Ngen, если необходимо уменьшить время запуска приложения.

11
ответ дан Chris Zwiryk 24 November 2019 в 08:19
поделиться

Можно использовать ngen.exe для генерации собственного изображения , но все еще необходимо распределить исходный несобственный код также, и ему все еще нужна платформа, установленная на целевой машине.

, Который не решает Вашу проблему, действительно.

4
ответ дан Matt Bishop 24 November 2019 в 08:19
поделиться

Природа.NET должна быть в состоянии установить приложения, которые были скомпилированы в MSIL, тогда или JIT или Ngen, MSIL компилируется в собственный код и хранится локально в кэше. Это никогда не предназначалось при генерации истинного собственного .exe, который может быть выполнен независимо от платформы.NET.

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

1
ответ дан spoulson 24 November 2019 в 08:19
поделиться

Я думаю, что это не возможно. Необходимо будет распределить.NET FW также. Если Вы хотите скомпилировать приложение.NET в собственный код, используйте инструмент NGen

-3
ответ дан aku 24 November 2019 в 08:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: