Можно ли освободить сборку, созданную с помощью CodeDomProvider? - PullRequest
1 голос
/ 17 марта 2019

Я хочу написать приложение, которое позволяет пользователю определять фрагменты кода, управляемого GUI.

В этом контексте я хочу отправить эти определения фрагмента службе, которая сможет скомпилировать и запустить ее (code dom, провайдер code dom, ...) для нескольких целей.

Поскольку эти скомпилированные сборки будут создаваться много раз, мой вопрос о том, как их освобождать при необходимости.

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

Но так ли это для сборок, скомпилированных на лету?И, если необходимо, как генерировать эти сборки в отдельном домене приложения?

Например, нужен ли подход, указанный в этом вопросе , в моем случае (здесь я предполагаю весь процесс компиляциии использование во время выполнения должно быть сделано в отдельном домене приложения)?

1 Ответ

1 голос
/ 17 марта 2019

Из моего ПОУ вы смешиваете две вещи здесь:

  1. Компиляция и
  2. Выполнение

Вы можете скомпилировать столько кода, сколько захотитес провайдером CodeDom и записать полученный код cs в любом месте, затем вы утилизируете модуль записи CodeDom (CSharpCodeProvider) и используемая память исчезает.

При выполнении кода происходит нечто совершенно иное.Есть несколько библиотек, которые предоставляют вам способ выполнения кода Cs, но все они (по большей части) имеют одну и ту же проблему по умолчанию.Код будет выполнен в пределах исполняемого приложения.Для этого требуется домен приложения, поскольку выполнение чего-либо в среде .net назначено одному.Если вы хотите отделить выполнение «ненадежного» кода от кода своего хоста, потребуется другой домен приложения.

Скрипты (c #) Libs в C #:

Примечание. Выполнение сценария CS является адской защитой.Существуют неограниченные способы вырваться из домена приложения, и без особых усилий по защите вашего домена приложения от этих атак вы получите огромное целое в концепции безопасности вашего приложения.Я недавно провел оценку и решил использовать вместо этого javascript в качестве языка сценариев (с движком Chakara.Core).

...