You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用InterfaceA的DoStuff()为何需引用AssemblyB?

问题解析:接口继承引发的程序集引用依赖

这个问题的核心在于**.NET编译器对接口继承链的元数据验证规则**——哪怕你调用的方法和某个基接口完全无关,只要目标接口继承了该基接口,编译器就需要访问所有基接口的元数据才能完成类型校验。

为什么调用DoStuff()需要引用AssemblyB?

你的InterfaceA同时继承了两个接口:InterfaceAWithMethod(来自AssemblyA)和InterfaceB(来自AssemblyB)。当你在AssemblyC中调用myInstanceOfA.DoStuff()时:

  1. 这个方法并不是直接定义在InterfaceA上的,而是从InterfaceAWithMethod继承而来。
  2. 编译器需要沿着继承链验证:InterfaceA确实继承了InterfaceAWithMethod,才能确认DoStuff()是合法的调用。
  3. 而在验证InterfaceA的继承关系时,编译器必须加载InterfaceA的完整元数据——其中包含了它所有的基接口列表(包括InterfaceB)。
  4. 即使DoStuff()和InterfaceB没有任何关联,编译器也需要访问InterfaceB的元数据来完成InterfaceA的类型解析,否则无法确认整个继承结构的合法性。

为什么调用MainMethod()没有错误?

MainMethod()是直接定义在InterfaceA本身上的方法,不属于继承链的一部分:

  1. 编译器只需要检查InterfaceA的元数据中是否存在这个方法,不需要遍历它的继承链。
  2. 只要编译器能通过仓储返回的实例类型推断(或间接引用)找到InterfaceA的元数据,就能确认MainMethod()的合法性,不需要加载它的基接口(InterfaceB)的元数据。

额外排查提示

你提到AssemblyC已经引用了AssemblyB但仍报错,可能是以下原因导致:

  • AssemblyC引用的AssemblyB版本、公钥令牌与AssemblyA依赖的版本不匹配。
  • AssemblyC项目中AssemblyB的「复制到输出目录」设置异常,导致运行时无法找到正确的程序集文件。
  • 仓储返回的InterfaceA实例来自的AssemblyA,依赖的AssemblyB与AssemblyC引用的不是同一个程序集(比如一个在GAC,一个在本地目录)。

内容的提问来源于stack exchange,提问作者Mattkwish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:23:13