在不同位置从同一程序集加载的对象之间的Cast Exception

时间:2013-10-02 15:41:29

标签: c# .net dll assemblies

我正在尝试使用提供的DLL,它从两个不同的位置加载相同的依赖DLL。

在供应商部署中,这两个地点是自杀的,但不是我的。

当代码运行时,我有一个类强制转换异常:

Unable to cast [A]Type to [B]Type

错误与StackOverflow问题Different location of assemblies stoped the type casting中的操作相同。

这两种类型是从DLL的两个不同位置加载的相同类型(在两个目录中复制的相同物理文件)。

我尝试使用强名称和双DLL的签名,但它不起作用。

有没有办法告诉CLR将这两种类型视为同一类型?

1 个答案:

答案 0 :(得分:1)

我很确定很多原因都不允许这样做。

首先,假设您有2个组件。第一个定义Animal,并有一个名为Dog的后代。第二个定义了Animal。两个程序集都使用相同的命名空间。

在运行期间,当您声明var B = new Dog();时会发生什么?代码是否应该在那里交换第二个程序集的Animal版本?

如果您声明var A = new Animal();怎么办?恕我直言,代码应该简单地内爆以防止它。

从安全角度来看,您绝对不希望有人简单地链接到另一个定义与您的库相同的命名空间的程序集来交换特定的类。

重点是,通过链接到包含完全相同类型的两个物理组件,您引入了一个没有真正解决方法的巨大问题。将代码更改为与供应商一样的工作方式。