在涉及具有不同版本的多个私有程序集的.NET DLL地狱场景中,我有哪些选择?

时间:2015-04-08 23:41:51

标签: c# .net dll .net-assembly appdomain

我正在为第三方应用程序(.NET)编写插件。此应用程序允许我选择要加载的插件(作为.dll库文件)。但是,如果我有相同库的两个版本---它们具有相同的名称但位于不同的目录中 - 并尝试一个接一个地加载,它只加载第一个插件并将第二个插件视为第二个插件这是第一次。换句话说,如果第一个插件应该显示一个消息框说“第一个插件”而第二个插件应该显示一个消息框说“第二个插件”,然后加载第二个插件-in 之后,第一个将实际显示一条消息“First plug-in”(即第二个插件实际上从未加载过)。

在线搜索和阅读后,我认为问题在于第三方应用程序将其插件加载到其主AppDomain中。因此,永远不会卸载插件库(变为已锁定?),并且后续尝试加载具有相同名称的插件只会使用已加载的库。我想也许签署我的插件库可以解决问题,但遗憾的是,我无法签署它们,因为我依赖于第三方应用程序提供的.dll而且它没有签名。另外,我无法更改第三方应用程序的配置文件,因此无法进行探测。

我们当前的解决方案是为我们拥有的每个版本的插件库重命名程序集(例如,“PlugIn-1.0.dll”和“PlugIn-2.0.dll”),包括重新命名所有他们的依赖集会。我的意思不仅仅是更改文件名,而是更改AssemblyName属性并重新编译。这有效,但我想看看是否有更清洁的解决方案。如果它只是我们不得不改变的插件程序集名称就不会那么糟糕,但我们也被迫改变所有依赖的.dll(因为不同的插件可能会使用这些.dll的不同版本) )。我尝试为插件库创建配置文件以更改探测目录,但这不起作用。看起来它是应用程序本身进行探测,而不是依赖于.dll的库(我在推断它时是否正确?)

最后,我尝试让我的插件创建一个AppDomain并将其依赖的.dll加载到其中,但不幸的是我的插件目录位置(和依赖的.dll)必须位于相对于第三方应用程序的远程位置。在.NET 4.0(我正在使用)中的网络位置加载程序集存在安全/权限问题,这是我无法解决的。

我有什么选择?提前谢谢。

1 个答案:

答案 0 :(得分:2)

我认为你正在通过启动自己的AppDomain来敲门。这是我所知道的唯一方法,即将同一程序集的不同版本加载到同一进程中。

是的 - 一旦.NET appdomain加载了一个程序集,它就不会加载该程序集的另一个版本。谁是第一个胜利者。当然,装载后无法卸载装配体。

关于您的权限问题..您可以将程序集从该网络位置复制到用户文件夹(用户具有写权限)并从那里加载它们吗?我已经成功地为自动更新应用程序做了这个。