2010-10-27 60 views
0

我在我的應用程序中創建了一個appDomain,其中的基本目錄與我的應用程序目錄不同,但它在應用程序下。我在創建的域中加載了一個程序集,並從該域創建對象實例。然後我嘗試執行該對象的方法。但我觀察到一個奇怪的行爲。默認的搜索基目錄不是appDomain.BaseDirectory?

public class Class1 : MarshalByRefObject 
{ 
    public void action() 
    { 
     Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); 
     TextReader sr = new StreamReader(File.OpenRead(AppDomain.CurrentDomain.BaseDirectory + "\\test.txt")); 

     Console.WriteLine(sr.ReadToEnd()); 
    } 
} 

在appDomain.BaseDirectory下有一個'test.txt'文件。但是如果我只給出文件名,應用程序仍會嘗試從應用程序執行目錄中搜索文件,但無法找到該文件。

如何確保在另一個域中執行的代碼使用基本目錄作爲默認搜索路徑。

回答

0

由Windows(Environment.CurrentDirectory)維護的進程的當前目錄是而不是受AppDomainSetup影響的。它隻影響CLR查找程序集的位置。改變CurrentDirectory會改變整個流程,當然這不是你想要的。

使用完整路徑名稱,就像您在代碼段中所做的一樣。

+0

感謝您的建議:) – davidshen84 2010-10-28 03:19:30

+0

@david - 閱讀此:http://blog.stackoverflow.com/2010/10/vote-early-vote-often/ – 2010-10-28 12:53:44

1

也許您需要使用重載的CreateDomain方法之一併指定基本目錄。以下作品適用於我:

AppDomain domain = AppDomain.CreateDomain("MyDomain", AppDomain.CurrentDomain.Evidence, "C:\\Projects\\ConsoleApplication1\\ClassLibrary1\\bin\\Debug\\", ".", true); 
ObjectHandle o = domain.CreateInstanceFrom("ClassLibrary1.dll", "ClassLibrary1.Class1"); 
AppDomain.Unload(domain); 

在我的代碼中,您的動作方法實現已移至構造函數。

+0

確定我已經設置了基本目錄參數。在你的示例中,你使用了調試目錄,調試應用程序將在調試目錄下執行,所以你看不到任何區別。 – davidshen84 2010-10-27 04:35:34

+0

請注意,我運行創建此應用程序域的應用程序的目錄是C:\ Projects \ ConsoleApplication1 \ ConsoleApplication1 \ bin \ Debug \。我將基本目錄分配到包含您提供的代碼的程序集的位置。只要test.txt文件位於同一目錄中,我就可以將此程序集放在任何目錄中,並且它仍然可以工作。 – 2010-10-27 06:18:25