3

我有一个问题,目前无法解决。

我有一个从文件夹加载插件(.dll 程序集)的程序集(一个可执行的 .net 4.0)。主可执行文件引用了 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)

所以问题是我的插件可以从不同的位置引用不同版本的程序集(以及它引用的程序集),因为现在它加载了由主程序集加载的程序集。

谢谢。

4

2 回答 2

1

简短的回答是否定的,如果较新的 dll 具有相同的程序集信息。

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

于 2012-08-22T17:12:18.077 回答
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>

可能还有更多,但我认为这就是我们所要做的。

于 2012-08-22T17:17:25.947 回答