Невозможно загрузить исполняющуюся сборку в новый домен приложений, 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);

У меня были похожие проблемы, и создание копии решило их для меня

Другие вопросы по тегам