Невозможно загрузить исполняющуюся сборку в новый домен приложений, FileNotFoundException - PullRequest
1 голос
/ 20 января 2011

Я пытаюсь разместить прокси класса текстового шаблона в новом домене приложений.

У меня есть старый код сценария, который выполняет нечто похожее, содержит этот рабочий код:

_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, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = bb70a2e62a722ace' или одна из его зависимостей.Системе не удается найти указанный файл.

Чего мне не хватает?

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

Это работает, если я использую более старый код, но не с этим новым, но я могу 'Разница не заметна.

Вот еще несколько деталей:

  • Сборка не зарегистрирована в GAC (не было и старой, которая работает)
  • У меня естьне переопределяет ни одно событие AssemblyResolve (как и старое, которое работает)

Я не против обработки события AssemblyResolve, если это то, что нужно.Мне показалось странным, что мой старый код работал, а это не так.

Ответы [ 2 ]

12 голосов
/ 20 января 2011

Предполагая, что ваша сборка находится в том же каталоге, что и текущая база приложения, попробуйте указать базу приложения:

        AppDomain.CreateDomain(templateDomainFriendlyName, null,
            new AppDomainSetup
            {
                ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
            });
4 голосов
/ 11 декабря 2013

Если вы не знаете, что делаете, лучший способ создать новый домен - скопировать все настройки из текущего, например:

        var newDomain = AppDomain.CreateDomain("NAME", 
                        AppDomain.CurrentDomain.Evidence,
                        AppDomain.CurrentDomain.SetupInformation);

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

...