Невозможно загрузить исполняющуюся сборку в новый домен приложений, FileNotFoundException
Я пытаюсь разместить прокси класса текстового шаблона внутри нового домена приложений.
У меня есть старый код сценария, который делает что-то подобное, который содержит этот рабочий код:
_ScriptAppDomain = AppDomain.CreateDomain(scriptDomainFriendlyName);
_ScriptProxy = (IScriptEngineProxy)_ScriptAppDomain.CreateInstanceAndUnwrap(
Assembly.GetExecutingAssembly().FullName,
"LVK.Scripting.ScriptEngineProxy");
Тем не менее, когда я пытаюсь это с моим новым классом, со следующим
_TemplateDomain = AppDomain.CreateDomain(templateDomainFriendlyName);
_TemplateProxy = (ITemplateProxy)_TemplateDomain.CreateInstanceAndUnwrap(
Assembly.GetExecutingAssembly().FullName,
"TextTemplate.TemplateProxy");
Я просто получаю "FileNotFoundException" со следующими деталями:
Не удалось загрузить файл или сборку 'TextTemplate, версия =1.0.0.0, Culture= нейтральный, PublicKeyToken=bb70a2e62a722ace' или одну из ее зависимостей. Система не может найти указанный файл.
Что мне не хватает?
По сути, у меня есть класс Template в пространстве имен TextTemplate (и сборка), который пытается загрузить класс TemplateProxy (происходящий от MarshalByRefObject) в новый домен приложения, но, похоже, моя основная сборка не загружена в этот домен.
Это работает, если я использую старый код, но не с этим новым, но я не могу определить разницу.
Вот еще несколько деталей:
- Сборка не зарегистрирована в GAC (не было и старой, которая работает)
- Я не переопределил ни одно событие AssemblyResolve (как и старое, которое работает)
Я не против обработки события AssemblyResolve, если это то, что нужно. Мне показалось странным, что мой старый код работал, а это не так.
2 ответа
Предполагая, что ваша сборка находится в том же каталоге, что и текущая база приложений, попробуйте указать Application Base:
AppDomain.CreateDomain(templateDomainFriendlyName, null,
new AppDomainSetup
{
ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
});
Если вы не знаете, что делаете, лучший способ создать новый домен - скопировать все настройки из текущего, например:
var newDomain = AppDomain.CreateDomain("NAME",
AppDomain.CurrentDomain.Evidence,
AppDomain.CurrentDomain.SetupInformation);
У меня были похожие проблемы, и создание копии решило их для меня