2008-09-17 86 views
30

我想要動態加載一個或多個DLL,以便它們使用與我的主應用程序不同的安全性或基本路徑運行。如何將這些DLL加載到單獨的AppDomain中並從它們實例化對象?將DLL加載到單獨的AppDomain中

+0

[最簡單的方法來進行跨應用程序域調用?](http://stackoverflow.com/questions/6242573/simplest-way-to-make-cross-appdomain-call) – user626528 2017-02-14 18:23:25

+0

引用的上下文可能的重複是不同的。在引用的問題中,目標是調用AppDomain中的代碼,而不是由開發人員創建或在其控制之下。這個問題特別關於在開發人員控制的AppDomain中加載代碼,以便他們可以修改AppDomain的特性。另外,引用的問題也沒有給出如何在運行時動態加載DLL的完整代碼示例,這是此問題的關鍵組成部分。 – 2017-02-15 16:41:11

回答

33

更具體地說

AppDomain domain = AppDomain.CreateDomain("New domain name"); 
//Do other things to the domain like set the security policy 

string pathToDll = @"C:\myDll.dll"; //Full path to dll you want to load 
Type t = typeof(TypeIWantToLoad); 
TypeIWantToLoad myObject = (TypeIWantToLoad)domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName); 

如果一切正常去(沒有拋出異常),你現在有加載到新域TypeIWantToLoad的一個實例。您擁有的實例實際上是一個代理(因爲實際對象位於新域中),但您可以像使用普通對象一樣使用它。

注:據我所知TypeIWantToLoad必須從MarshalByRefObject繼承。

2

您可以使用AppDomain.CreateInstance方法來執行此操作。您需要調用返回的ObjectHandle的Unwrap方法以獲取實際對象。

+0

如果我想要創建的實例的對象在我試圖加載的程序集中定義,該怎麼辦?我不知道什麼是這個對象的名稱,而實際上沒有實際加載程序集... – 2011-06-06 08:33:58

+0

@liortal這個問題的接受答案做你需要做的? – Andy 2011-06-06 12:58:02

0

使用AppDomain.Create(...)創建一個新的AppDomain。 創建AppDomain後,將DLL加載到該AppDomain中。

查看AppDomain使用Create *創建的所有方法。有一些像CreateInstanceAndUnwrap等

0

如前所述,使用AppDomain.CreateDomain創建一個新的應用程序域。然後,您可以使用Load方法將程序集加載到程序集中,甚至可以使用ExecuteAssembly方法執行程序集。您可以使用GetAssemblies查看程序集是否已被加載。請注意,一旦它被加載,您就無法卸載程序集。您將需要卸載域。

相關問題