C#类型定义在未被引用的程序集中

14

我有两个项目A和B。项目A在其内使用了项目B中的类型X,因此我将B添加到了A的引用中。一切都编译成功。

我使用了一个强名称密钥文件对项目B进行签名。一切仍然编译成功。

然后我决定更改B的强名称密钥文件。我重新编译了项目B,没有问题。但是当我尝试构建项目A时,出现错误:“错误1:类型X定义在未被引用的程序集中。您必须添加对程序集B、版本=1.0.0.0、文化=neutral、PublicKeyToken=95b41b0d6571627b的引用。”

于是我删除了项目A中的引用并重新添加,但无济于事。我可以双击项目A中的项目B引用,在对象浏览器中打开并看到其中的类型X。我还完整地限定了A中的类型X对象,并且智能感知功能很好地捕捉到它们,但仍无法编译。

我以为更改密钥文件可能需要升级版本号,因此我将B程序集版本更改为2.0.0.0,但A仍然抱怨需要1.0.0.0版本。查看A中B引用的属性,它确实指向正确的版本,而且显示为2.0.0.0。

如果可以,我想弄清楚我错在哪里,但我也可以使用现有的密钥文件。


嗨,Merlyn,不,B没有延迟签名。 - CSharpHolder
2
尝试创建一个全新的项目,并添加对项目B的引用。这至少可以告诉您是项目A还是项目B出了问题。 - Steve Danner
@Steve - 我试过了,新项目构建成功。 - CSharpHolder
类似的问题在 https://dev59.com/RmIj5IYBdhLWcg3wEhUA 中有讨论。 - Michael Freidgeim
7个回答

4
根据您在评论中提到的内容,我认为问题肯定与项目A有关。也许以下步骤可以帮助解决它:
  1. 删除对项目B的引用并保存
  2. 使用记事本或其他工具打开.csproj文件
  3. 查找其中任何对项目B的引用(可能是hintpath节点)并删除该节点。
  4. 如果项目A恰好是ASP.NET项目,请查看您的web.config文件或aspx页面头部是否有任何对项目B的引用。
一旦删除了所有对该项目的引用,请像bottlenecked建议的那样重新加载该项目,并查看是否已经修复了问题。

3

很抱歉回复晚了,但是这个方法对我很有帮助:

(假设您目前的解决方案平台为AnyCPU)

  • 将解决方案平台切换为x86。
  • 编译
  • 切换回去
  • 再次编译。

为什么要踩?这种方式有时候对我很有帮助。 - Roman Zavalov
1
也许是因为解决方案感觉像一个不真正修复潜在问题的临时补救措施? - Phil Cooper
“Underlying issue” 可能在 VS 源代码中,因此我们无法修复。 - Roman Zavalov

1
我所做的是将项目引用删除,然后再次添加。出现了一个新的错误消息,指出我需要引用缺失的第三方库,因此原始消息有点误导!

1

这也发生在我身上。

我的情况是,从解决方案A中引用了解决方案B的项目(我更改了B项目的名称)。当我尝试编译A时,它试图在B中查找旧项目的名称。

我重新添加了该项目的新引用,重新编译等等,但不幸的是它没有起作用。

问题得到解决后,我在A中再次添加了B的所有引用。我正在加载使用旧的B项目编译的旧DLL。这些DLL与旧引用存在某种交互作用。

希望这对其他人有用。


0
为了帮助从Google来到这里的人,Merlyn's comment提到delay-signed对我很有帮助。
在引用程序集 A 中定义的类型 X 的时候,我遇到了一个引用了delay-signed的程序集 A 的错误。我收到的错误信息是B没有被引用(而我已经引用了B的签名版本)。
解决方法是找到并引用A的签名版本。

0
您可以尝试编辑项目 A 的项目文件(projectA.csproj)。在 Visual Studio 中,右键单击该项目并选择“卸载项目”,然后再次右键单击已卸载的项目并选择“编辑文件”。在其中搜索指向项目 B 的引用,并进行必要的更正。

谢谢,我看了一下那里,但是参考资料看起来没问题。我已经采取了取消签名的方法,重新构建所有内容,然后应用新的密钥文件。 - CSharpHolder

-1

如果 x 继承了 A,你必须在 B 中引用它


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接