2012-03-03 3 views
1

У меня есть класс на C# 2.0 с помощью следующего кода:AppDomain DoCallBack FileNotFoundException - C#

public class MyClass : MarshalByRefObject, IDisposable 
    { 
     private string _appName; 
     private AppDomain _app; 

     public MyClass(string appName) 
     { 
      _appName = appName; 
      _app = AppDomain.CreateDomain("NewDomain" + _appName); 
      _app.DoCallBack(new CrossAppDomainDelegate(CallBackMethod)); 
     } 

     public void Dispose() 
     { 
      AppDomain.Unload(_app); 
     } 

     public static void CallBackMethod() 
     { 
      //some operations 
     } 
    } 

Этот класс содержится в рамках проекта Class Library, то ссылка из веб-приложения проекта.

Так, в моей веб-странице я просто экземпляр объекта, ожидая, что конструктор класса будет создавать эту новую AppDomain и выполнить указанные операции:

MyClass objMyClass = new MyClass("12022012213456"); 

Но я получаю эту ошибку:

Could not load file or assembly 'MyNamespace.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

Но любопытно, что здесь в том, что это исключение происходит на этой линии:

_app.DoCallBack(new CrossAppDomainDelegate(CallBackMethod)); 

И как вы можете видеть, это происходит на MyClass, поэтому я не понимаю, как он мог сказать мне, что сборка не может быть найдена, если код уже выполняется ??? Я просто не понимаю.

BTW, я новичок в использовании AppDomain, может быть, я смущен некоторой концепцией.

+1

Вы можете узнать свойства __app.BaseDirectory и _app.RelativeSearchPath сразу после строки _app = AppDomain.Create? Каждому домену приложения приходится решать свои собственные сборки. Подумайте об этом как о процессе внутри процесса. По какой-то причине новый домен приложения не может найти сборку, RelativeSearchPath и BaseDirectory могут дать некоторые подсказки. – Adam

+0

@Добавьте следующие значения: RelativeSearchPath = null; BaseDirectory = "c: \ WINNT \ Microsoft.NET \ Framework \ v2.0.50727 \", они хороши? – lidermin

ответ

3

Похоже, что у AppDomain, созданного вами (_app), возникли проблемы с поиском вашего класса MyClass в его сборке. Ваш CreateDomain не предоставил никакого AppDomainSetup информации, поэтому он не имеет контекста для текущих каталогов доменов приложений или сборок. У вас есть два варианта, обеспечьте правильно настроенный AppDomainSetup или позвоните по телефону _app.Load(Assembly.GetExecutingAssembly.FullName) до вашего метода DoCallBack.

0

У меня была эта проблема, но решение было другим. В моей ситуации мне нужно было явно предоставить свой собственный объект AppDomainSetup и указать папку ApplicationBase, чтобы она действительно могла найти мою сборку.

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