У меня есть код C# (назовем его «скриптом») Я компилирую во время выполнения. В моей основной программе используется интерфейс, который я использую для доступа к его функциям. После компиляции у меня есть CompilerResults.CompiledAssembly
, и в этом случае я могу CreateInstance(Type)
.Unload CodeDom-скомпилированная сборка
Как только я закончил использовать сценарий, я хотел бы полностью выгрузить. Из того, что я понимаю, что я могу сделать это, только если создать отдельный домен приложения: Loading DLLs into a separate AppDomain
Я имел некоторые вопросы, относящиеся к моей реализации:
- Если у меня есть несколько сценариев для компиляции и хотят выгрузить их независимо, мне нужно создавать отдельные домены приложений для каждого?
- Какие доменные имена приложений следует использовать? Были бы GUIDs хорошей идеей? Есть ли какие-либо имена, которых я должен избегать, которые могут конфликтовать?
- Если сборка находится в отдельном домене приложения, будет ли она иметь какие-либо проблемы с доступом к интерфейсу в основной программе? В настоящее время я делаю
ReferencedAssemblies.Add(typeof(Interface).Assembly.Location)
перед компиляцией. - Могу ли я использовать
CompilerParameters GenerateInMemory=true
, или мне нужно его где-то сохранить?
У меня были проблемы с тем, чтобы это работало, поэтому я сделал еще несколько исследований. Похоже, мне нужно будет сделать еще одну работу, чтобы заставить ее работать: http://www.devsource.com/c/a/Using-VS/Dynamic-Plugins-Using-the-codeAppDomaincode-Class-to-Load и-Разгрузка-код /. Разве что-то новое в более поздних версиях? –
Похоже, мне повезло. Поскольку я использую .NET 3.5, я могу использовать Managed Extensibility Framework. Конечно, мне нужно научиться этому сейчас. :) –
Похоже, я вхожу глубже, чем хотел/ожидал. MEF фактически не может разгружать сборки, поскольку он не использует отдельный AppDomain. MAF (System.AddIn) может, но гораздо сложнее в использовании. MAF и MEF могут использоваться вместе. Хотя я действительно хочу, чтобы иметь возможность разгружать сборку, я думаю, что это должно будет подождать, по крайней мере, для версии 2. –