AppDomain 卷影副本 - 加载/卸载动态加载的 Dll

Posted

技术标签:

【中文标题】AppDomain 卷影副本 - 加载/卸载动态加载的 Dll【英文标题】:AppDomain shadow copy - Loading /Unloading a dynamically loaded Dll 【发布时间】:2010-08-05 09:22:01 【问题描述】:

下面我尝试动态加载 dll 的代码不起作用。

AppDomain appDomain = AppDomain.CreateDomain("DllDomain");
Assembly a = appDomain.Load(fileName);
//Assembly a = Assembly.LoadFrom(fileName);
objType = a.GetType(className);
obj = a.CreateInstance(className);
object[] args = new object[1];
args[0]=(object) "test";
object ret = objType.InvokeMember("Perform", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, args);
string output = ret.ToString();
obj = null;
AppDomain.Unload(appDomain);

这是我在 WCF 服务中使用的代码,但它仍然不起作用。

听说我们可以在 AppDomain 中使用“影子复制”。但是我对“影子复制”以及如何在上面的代码中实现它一无所知。

请提供工作代码作为“影子复制”的示例。

-BS

【问题讨论】:

@Downvoter:为什么要投反对票? 刚刚又遇到了这个问题。我去年投了反对票,因为这不是一个特别好的问题。这是一个代码转储,你要说的只是它“不工作”。所以也不清楚你希望通过影子复制解决什么问题。 【参考方案1】:

您可以将程序集加载到应用程序域中,但不能从该域中卸载它们。

但是,您可以在一个应用程序域中创建第二个应用程序域并将程序集加载到第二个应用程序域中。稍后您可以选择卸载第二个应用程序域,从而卸载您加载到第二个应用程序域的程序集。

这是基本原则。在实践中,您会发现许多障碍(它们通过 .NET 的版本而改变)需要解决,尤其是当您在应用程序域之间设置某种形式的通信时。

在这里提供工作代码可能会太大。

【讨论】:

以上是关于AppDomain 卷影副本 - 加载/卸载动态加载的 Dll的主要内容,如果未能解决你的问题,请参考以下文章

将目录添加到 ASP.NET 卷影副本

vb.net编程,如何使用 appdomain 实现某进程DLL动态加载和卸载?

将 c# 程序集动态加载和卸载到 appdomain

C# 通过 AppDomain 应用程序域实现程序集动态卸载或加载

AppDomain 详解二-C#中动态加载和卸载DLL

C# 通过 AppDomain 应用程序域实现程序集动态卸载或加载