关于c#:将DLL加载到单独的AppDomain中

关于c#:将DLL加载到单独的AppDomain中

Loading DLLs into a separate AppDomain

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


进一步来说

1
2
3
4
5
6
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继承。


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


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


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


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

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


推荐阅读