2010-08-05 188 views
-1

我试图动态加载dll的代码如下,不起作用。AppDomain的影子副本 - 加载/卸载动态加载的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中使用“阴影复制”来达到目的。但我不知道任何关于'Shadow Copying'的内容,以及如何在上面的代码中实现相同的功能。

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

-B.S.

+0

@Downvoter:为什么Downvote? – venkat 2017-01-17 07:57:23

+0

刚刚再次遇到这个问题。我去年低估了它,因为这不是一个特别好的问题。这是一个代码转储,所有你必须说的是它是“不工作”。所以也不清楚你希望通过使用阴影复制解决什么问题。 – Stijn 2017-12-13 14:55:43

回答

0

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

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

这是基本原理。实际上,当你在应用程序域之间建立某种形式的通信时,你会发现许多障碍(它们通过.NET的版本进行了更改),以便特别解决。

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