让我先提出一个情景,看看是否有人有解决方案/变通方法。
我有一个只包含类的库(DLL)。在另一个库中,我有实现第一个库中类的接口。客户端将始终引用仅包含接口的库的一个版本(始终是最新的版本) - 并且只会对这些接口进行添加(更多接口/方法)。此外,那个接口库只有一个版本 - 因此客户端不需要更新引用(接口库将通过反射加载 - 因此通常的探测规则不适用,我们只能加载客户端特定请求的内容)。实现接口的库将具有多个版本,不同的客户端同时引用。
问题出现在客户端程序集引用了实现库的旧版本。它创建了一个来自实现库中的类类型的对象,然后将其传递给另一个客户端程序集。该客户端程序集使用最新(也是唯一)版本的接口库,并尝试将传递给它的对象强制转换为相应的接口类型。这个强制转换失败,并出现了异常System.TypeLoadException: Method X in type Y from assembly Z does not have an implementation。我预期会出现这个异常,因为在接口的新版本(版本号相同-旧库被覆盖)中,已经定义了方法X,但是即使传递的旧对象包含了元数据,表明它实现了相应的接口,映射在新接口方法X上失败了,因为它在那个类中没有实现。
所以,我的问题是这样的;是否有一种方法让客户端使用该接口,但仅在调用未在引用对象上实现的方法时引发异常(而不是在将引用对象转换为较新接口类型时生成异常)?
顺便说一句-延迟绑定不是选项,因为我们想要智能感知/编译时类型检查...另外,我知道如何使用函数指针和包装器类来做到这一点-我只是希望有一个更符合常规.NET类型的更好的解决方案。
谢谢--非常感谢您的帮助