32

我想动态加载一个或多个 DLL,以便它们以与我的主应用程序不同的安全性或基本路径运行。如何将这些 DLL 加载到单独的 AppDomain 并从中实例化对象?

4

5 回答 5

35

进一步来说

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。

于 2008-09-18T14:29:27.043 回答
4

如果您的目标是 3.5,则可以利用新的托管可扩展性框架 为您处理所有繁重的工作。

于 2008-09-17T23:50:12.213 回答
2

您可以使用AppDomain.CreateInstance方法来执行此操作。您需要调用返回的 ObjectHandle 的 Unwrap 方法以获取实际对象。

于 2008-09-17T23:46:48.007 回答
0

使用 AppDomain.Create( ... ) 创建一个新的 Appdomain。创建 AppDomain 后,将 DLL 加载到该 AppDomain 中。

使用 Create* 查看 Appdomain 的所有方法。有某些东西,如 CreateInstanceAndUnwrap 等。

于 2008-09-17T23:50:47.890 回答
0

如前所述,使用 AppDomain.CreateDomain 创建一个新的应用程序域。然后,您可以使用 Load 方法将程序集加载到其中,甚至可以使用 ExecuteAssembly 方法执行程序集。您可以使用 GetAssemblies 查看是否已加载程序集。还要注意,一旦加载了程序集,就无法卸载它。您将需要卸载域。

于 2008-09-18T00:27:05.727 回答