2011-01-20 3 views
0

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

I просто получите «FileNotFoundException» со следующей информацией:

Не удалось загрузить файл или сборку «TextTemplate, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = bb70a2e62a722ace 'или одна из его зависимостей. Система не может найти указанный файл.

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

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

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

Вот еще некоторые детали:

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

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

+0

вы добавили код для сборки решения? Возможно, это поможет вам получить более подробную информацию. –

+0

Развертывается ли сборка TextTemplate в GAC? –

+0

@ Сэм, нет, это не так, но и не было старой сборки. –

ответ

11

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

 AppDomain.CreateDomain(templateDomainFriendlyName, null, 
      new AppDomainSetup 
      { 
       ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase 
      }); 
+0

Ну, с этим, что часть кода прошла без проблем, но теперь я получаю «Исполняемый файл компилятора csc.exe не может быть найден». –

+1

Откуда у вас эта ошибка? –

+0

В коде, который компилирует мой шаблон. Я попытался сократить все до небольшой программы, но это сработало, поэтому я попытаюсь расширить его, чтобы посмотреть, где проблема. –

3

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

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

Я имел аналогичные проблемы, и сделать копию решить их для меня

Смежные вопросы