2012-06-13 73 views
2
using System; 
using System.IO; 
using System.Reflection; 
using System.Text; 
using MyApp.Logging; 

namespace MyApp.SmsService.Common 
{ 
    public class MyAppAppDomain:MarshalByRefObject 
    { 
     private readonly AppDomainSetup domaininfo; 
     private readonly AppDomain appDomain; 
     public static string libDllPath; 

     public MyAppAppDomain(string appDomainName) //Constructor 
     { 
      //Setup the App Domain Parameters 
      domaininfo = new AppDomainSetup(); 
      domaininfo.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; 
      domaininfo.DisallowBindingRedirects = false; 
      domaininfo.DisallowCodeDownload = true; 
      domaininfo.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; 

      // Create the application domain. 
      appDomain = AppDomain.CreateDomain(appDomainName, null, domaininfo); 

      //Set the dll path using Static class ref. 

      //Dependency resolution handler 
      appDomain.AssemblyResolve += LoadFromLibFolder; /*Exception*/ 
     } 

     private static Assembly LoadFromLibFolder(object sender, ResolveEventArgs args) 
     { 

      if (libDllPath != null) 
      { 
       string assemblyPath = Path.Combine(libDllPath, new AssemblyName(args.Name).Name + ".dll"); 

       if (File.Exists(assemblyPath) == false) 
       { 
        return null; 
       } 
       Assembly assembly = Assembly.LoadFrom(assemblyPath); 
       //Assembly dependancy resolved. 

       return assembly; 
      } 

      return null; 
     } 

     public Object getNewInstanceOf(string fullyQualifiedTypeName) 
     { 
      return appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, fullyQualifiedTypeName); 
     } 

     public Type getTypeOf(string fullyQualifiedTypeName) 
     { 
      return getNewInstanceOf(fullyQualifiedTypeName).GetType(); 
     } 

     public void unloadDomain() 
     { 
      AppDomain.Unload(appDomain); 
     } 
    } 
} 

上述類是我想創建的包裝程序,用於設置和拆卸應用程序域。但是,在我的web服務中,每當我實例化MyAppAppDomain的對象時,我都會收到FileNotFoundException [無法加載dll xyz.dll]。創建AppDomain安裝和拆卸的包裝

以下是前:

MyAppAppDomain.libDllPath = appDllLibPath; //Some directory other than bin. 
pluginDomain = new MyAppAppDomain("SmsServicePlugins"); //Throws FileNotFoundException. 

當我調試,我看到的是導致異常的行是一個上面標爲/ 例外 /,MyAppAppDomain的構造函數中。

什麼問題?

編輯:

我會通過其他文章,我讀的對象不能跨域可見。只有當對象可以在兩個域中進行序列化(使用MarshalByRefObject)並且可以通過代理訪問時纔會發生這種情況。

如果有人能夠指出上述代碼中的問題,會有很大的幫助。與此同時,我正在嘗試學習更多關於編組和編碼的知識。

回答

0

第一個問題是你正在嘗試做一切在應用程序領域的包裝,它實際上是兩個不同的組件。您需要的第一個組件是您希望在您的新應用程序域內創建的對象,它繼承自MarshalByRefObject(或標記爲Serializable)。另一個住在您當前的AppDomain內部,用於創建新的AppDomain

看看msdn example看看我的意思。

但是,您的錯誤可能比您的DLL錯誤的路徑更可能。你可以顯示完整的堆棧跟蹤來顯示哪一行拋出異常?