同一引用程序集的多个版本

3
我遇到了一个问题,但一直没有解决。
我有一个程序集(一个可执行的.net 4.0文件),它从文件夹中加载插件(.dll文件)。主程序集引用了telerik.windows.controls.dll并且运行得很好。
现在我编写了一个新的插件,它使用了telerik库的新版本,具体来说是telerik.windows.controls.GanttView程序集。问题在于GanttView控件使用了telerik.windows.controls.dll的新版本,因此插件无法加载telerik引用程序集而导致崩溃。
我知道我可以通过升级所有引用的程序集(telerik)来解决这个问题,但我的团队还没有对这些控件进行QA/测试,以确保不会引入新的错误。
所以,总结一下:
main.exe -> a.dll -> X.dll (v1)
然后我添加了一个名为b.dll的新插件:
main.exe -> b.dll -> X.dll (v2) +------------> X.dll (v1)
那么问题是,我的插件是否可以引用位于不同位置的不同版本的程序集(及其引用的程序集),因为它现在加载主程序集加载的那些程序集。
谢谢。
2个回答

1
我们在应用程序的某个时刻完成了这个任务。我们的做法是在 bin 目录中创建一个文件夹,其中包含过期的 dll 文件,然后将以下行添加到引用旧 dll 的 app.config 文件中...
<runtime>
    <assemblyBinding xmlns = "urn:schema-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity 
                name = "YourAssembly"
                />
            <codeBase version="YourAssemblyVersion" href = "FolderWithinBinDirectory/YourAssembly.dll"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

可能还有更多的细节,但我认为这就是我们需要做的全部。


1

简短的回答是,如果新的dll具有相同的程序集信息,则不行。

更长的答案是,在应用程序域中(除非您自己创建了更多),您只能加载特定程序集一次。再次强调,这是假设我们谈论的程序集(dll)具有相同的程序集信息。如果您想加载更新的程序集,则必须创建一个单独的应用程序域。但是,您将无法在初始应用程序域中使用它,其中包含您的其他控件。


我实际上有两个程序集,一个是主可执行文件,引用了旧版本的telerik,然后是一个插件(由主exe在其自己的应用程序域中加载),引用了新的telerik。我猜测新的telerik正在尝试访问放置在主可执行文件原始代码库文件夹中的其依赖项(其他程序集)。我无法为插件创建其他应用程序域,因为这是整个解决方案中的重大架构更改。 - Batiatto
你可以尝试一下:创建一个新的VS项目。将Telerik程序集添加为引用。如果VS没有报错,那么应该就没有问题了。否则,就有点棘手了。 - Maarten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接