2

让我给出一个场景,然后看看是否有人有解决方案/解决方法。

我有一个只包含类的库(DLL)。在另一个库中,我有第一个库中的类实现的接口。客户端将始终仅引用包含接口的库的一个版本(始终是最新版本) - 并且只会对这些接口进行添加(更多接口/方法)。此外,该接口库只有一个版本——因此客户端不需要更新引用(接口库将通过反射加载——因此通常的探测规则不适用,我们只能加载客户端具体的内容要求)。实现接口的库将具有不同客户端同时引用的多个版本。

当客户端程序集引用旧版本的实现库时会出现此问题。它从实现库中的类类型创建一个对象 - 然后将其传递给另一个客户端程序集。该客户端程序集使用最新(也是唯一)版本的接口库,并尝试使用适当的接口类型转换传递给它的对象。此转换失败,出现异常“System.TypeLoadException:来自程序集 Z 的类型 Y 中的方法 X 没有实现”。我预计会出现此异常,因为在新版本的接口(相同的版本号 - 旧库被破坏)中,定义了方法 X,但即使传递的旧版本对象包含表示它实现相应接口的元数据,

所以,我的问题是这样的;有没有办法让客户端使用该接口,但仅在调用未在引用对象上实现的方法时才导致异常(而不是在将引用对象转换为较新的接口类型时生成异常)?

顺便说一句 - 后期绑定不是一个选项,因为我们想要智能感知/编译时类型检查......另外,我知道如何使用函数指针和包装类来做到这一点 - 我只是希望有一个更好的解决方案,更多使用常规 .NET 类型进行调整。

谢谢 - 非常感谢任何帮助

4

1 回答 1

2

您可以在包含接口的库中使用抽象(MustInherit)类而不是接口,并将方法和属性设置为可覆盖。这样,即使这些方法只是抛出了一个未实现的异常,接口库中的每个方法也总会有一个实现。通过使方法为 Overridable 而不是 MustOverride 应该避免 TypeLoadException。

于 2009-03-06T03:11:30.823 回答