2010-01-16 22 views
3

我的場景是我有一個創建AppDomain的.net應用程序(我們說一個控制檯應用程序)。然後它需要在該AppDomain中的類型上創建實例和調用方法。每個AppDomain都有一個特定的目錄,它的依賴性應該在哪裏,哪個不在控制檯應用程序目錄下(甚至不在)。這是我的簡單代碼:另一個AppDomain中的類型的CreateInstance

string baseDirectory = "c:\foo"; // <- where AppDomain's dependecies 

// set up the app domain 
AppDomainSetup setup = new AppDomainSetup(); 
setup.ApplicationName = DateTime.Now.ToString("hh:MM:ss:ffff"); 
setup.ApplicationBase = baseDirectory; 
setup.PrivateBinPath = baseDirectory; 

// create app domain 
AppDomain domain = AppDomain.CreateDomain(
    name, 
    AppDomain.CurrentDomain.Evidence, 
    setup); 

// instantiate Type from an assembly in that AppDomain 
ObjectHandle handle = domain.CreateInstanceFrom(
    "SampleClassLibrary.dll", // <- exists in "c:\foo" 
    "SomeClassInTheDll"); 

對CreateInstanceFrom的調用導致FileNotFoundExcepotion。 FusionLog顯示它搜索的目錄是Console應用程序目錄。它沒有包含從AppDomain設置的搜索文件夾 - 在「baseDirecory」變量中。

我在做什麼錯?是否有另一種方法來執行另一個AppDomain中的代碼?

謝謝...

回答

3

一個解決辦法是通過完整路徑.CreateInstanceFrom電話:

ObjectHandle handle = domain.CreateInstanceFrom( 
    baseDirectory + @"\SampleClassLibrary.dll", // <- exists in "c:\foo" 
    "SomeClassInTheDll"); 
+0

只是提供對DLL的完全限定路徑的伎倆,至少我能加載該類型。似乎奇怪的是,AppDomain確實在「baseDirectory」中查找該dll。我想知道是否會有問題,如果該dll引用了該目錄中的其他dll。我會測試一下,看看。 謝謝布魯斯 – will 2010-01-16 05:26:17

+0

就像我認爲的,上述解決方案不起作用。這就像AppDomain無法找到它的任何依賴dll,因爲它正在查找的目錄是Console Apps目錄列表,而不是AppDomains ... 任何想法?這不可能很難嗎? – will 2010-01-16 22:39:42

+0

找出使用AssemblyResolve處理程序的技巧。 – will 2010-02-07 19:36:22

0

我不能說有什麼錯你的代碼,因爲它看起來像它應該工作。然而,當我有這樣的工作時,我幫助完成了這項工作。大致是這樣的:

public class Loader 
{ 
    public void Load(string typename) 
    { 
     // .... 
    } 
} 

Loader l = (Loader)domain.CreateInstanceAndUnwrap("Loader"); 
l.Load("SomeClassInTheDll"); 
相關問題