2009-09-22 2 views
10

У меня есть код C# (назовем его «скриптом») Я компилирую во время выполнения. В моей основной программе используется интерфейс, который я использую для доступа к его функциям. После компиляции у меня есть CompilerResults.CompiledAssembly, и в этом случае я могу CreateInstance(Type).Unload CodeDom-скомпилированная сборка

Как только я закончил использовать сценарий, я хотел бы полностью выгрузить. Из того, что я понимаю, что я могу сделать это, только если создать отдельный домен приложения: Loading DLLs into a separate AppDomain

Я имел некоторые вопросы, относящиеся к моей реализации:

  1. Если у меня есть несколько сценариев для компиляции и хотят выгрузить их независимо, мне нужно создавать отдельные домены приложений для каждого?
  2. Какие доменные имена приложений следует использовать? Были бы GUIDs хорошей идеей? Есть ли какие-либо имена, которых я должен избегать, которые могут конфликтовать?
  3. Если сборка находится в отдельном домене приложения, будет ли она иметь какие-либо проблемы с доступом к интерфейсу в основной программе? В настоящее время я делаю ReferencedAssemblies.Add(typeof(Interface).Assembly.Location) перед компиляцией.
  4. Могу ли я использовать CompilerParameters GenerateInMemory=true, или мне нужно его где-то сохранить?

ответ

2

Ответы в порядке:

  1. Да, если вы хотите, чтобы разгрузить их самостоятельно вам нужны отдельные домены приложений.
  2. Использовать что угодно. Это может помочь вам отладить, если вы можете идентифицировать его для скрипта, но это будет более верно для исполняемого потока.
  3. Пока вы не установили базовый путь настройки домена к своему.

    AppDomainSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

  4. Нет, вам не нужно его сохранять, и это не похоже, что это принесет пользу.

+0

У меня были проблемы с тем, чтобы это работало, поэтому я сделал еще несколько исследований. Похоже, мне нужно будет сделать еще одну работу, чтобы заставить ее работать: http://www.devsource.com/c/a/Using-VS/Dynamic-Plugins-Using-the-codeAppDomaincode-Class-to-Load и-Разгрузка-код /. Разве что-то новое в более поздних версиях? –

+0

Похоже, мне повезло. Поскольку я использую .NET 3.5, я могу использовать Managed Extensibility Framework. Конечно, мне нужно научиться этому сейчас. :) –

+1

Похоже, я вхожу глубже, чем хотел/ожидал. MEF фактически не может разгружать сборки, поскольку он не использует отдельный AppDomain. MAF (System.AddIn) может, но гораздо сложнее в использовании. MAF и MEF могут использоваться вместе. Хотя я действительно хочу, чтобы иметь возможность разгружать сборку, я думаю, что это должно будет подождать, по крайней мере, для версии 2. –