Интерпретация и / или получение кода dotNet во время выполнения - PullRequest
6 голосов
/ 15 сентября 2009

HTML может содержать маленькие кусочки встроенного в него JavaScript (например, определенные в onclick обработчиках событий).

  1. Если бы я писал браузер Html с использованием языка dotNet, такого как C #, какие технологии или API я мог бы использовать для запуска таких фрагментов Javascript, учитывая, что я не получаю его до времени выполнения (и получаю его как строковые данные, а не исполняемый код)?

  2. Легче или сложнее, если выполняемый код был фрагментом кода C #, а не Javascript?

  3. Есть ли какая-либо техника, которая не требует, чтобы мой код имел необычные привилегии? Например, такой метод, как CodeCompiler.FromSource, требует SecurityPermissionFlag.UnmanagedCode (что мне кажется чрезмерным: я не понимаю, почему компилировать код так рискованно).

  4. Если бы я контролировал как серверный, так и клиентский код, я мог бы также рассмотреть возможность компиляции таких фрагментов скриптов на сервере, а не на клиенте, а затем отправлять их в виде предварительно скомпилированного кода на стороне клиента. быть выполненным. Есть ли способ отправить такой код (сборка dotNet, предположительно) по сети клиенту, сделать так, чтобы код на стороне клиента получал его из сети в ОЗУ на стороне клиента и вызывал его на стороне клиента без сохранить его в виде файла на клиентском диске?


Редактировать

У меня есть ответ на первые три вопроса: я смирился с тем фактом, что компиляция требует высоких привилегий. Я не понимаю почему; возможно (хотя я не нахожу это очень убедительной причиной) это потому, что компилятор реализован с использованием неуправляемого кода. Возможно, это изменится, когда они переопределят компилятор, используя управляемый код, возможно на таймфрейме "C # version 5". В любом случае, какой бы ни была причина, похоже, что так оно и есть, и никаких обходных путей нет (другие подобные API, но требующие меньшего количества привилегий).

Мой оставшийся вопрос заключается в том, как получить экземпляр Assembly с одного компьютера на другой. Когда у меня будет время, я узнаю, может ли ненадежный код выполнить метод Assembly.Load(byte[] rawAssembly).

Ответы [ 2 ]

2 голосов
/ 15 сентября 2009
  1. Серверная часть Javascript - это один из языков, поддерживаемых платформой .NET. Я использовал это много раз в сценариях, когда вам нужно вставить небольшие фрагменты кода в существующий код. Во время выполнения он может быть загружен из базы данных и скомпилирован, так что штраф за предварительную производительность отсутствует.

  2. С точки зрения обеспечения работоспособности сантехники (поиск источника, его компиляция и т. Д.) Нет никакой разницы. В строго типизированных языках гораздо сложнее собрать фрагменты кода в компилируемый модуль компиляции.

  3. Разрешения, безусловно, являются проблемой. Я не уверен насчет конкретного разрешения, которое вы упомянули, но безопасность вызывает беспокойство, ведь исходный код, который вы компилируете, может быть любым, и если вы не будете осторожны с исходным кодом, он может стать бэкдором в вашу систему 1012 *

  4. Ответ на этот вопрос - да, конечно. Вы можете загрузить сборку из любого места, не обязательно из файла, вы также можете скомпилировать в памяти - это то, что я делаю. В этом случае нет файла DLL.

1 голос
/ 16 сентября 2009

Вы задаете несколько вопросов, вроде, поэтому я дам вам идею по одному из них. Есть очень хорошая статья и несколько примеров кода из: http://www.west -wind.com / презентации / dynamicCode / DynamicCode.htm который говорит о компиляции и выполнении кода C # во время выполнения. Я нашел это очень полезным, и я использую это в стандартном приложении C #. Похоже, это пригодится и для вашей проблемы.

...