在C#.NET中徘徊的程序集依赖性

时间:2020-03-05 18:39:15  来源:igfitidea点击:

在我的Cproject中,我们将其称为SuperUI,它用于利用外部程序集中的类。现在不行了,但是如果没有适当的程序集引用,编译器将不允许我构建项目。让我详细说明。

这个项目曾经抛出并捕获了一个自定义异常类" SuperException",该类是从标准System.Exception派生的,并存在于我引用的单独的预编译程序集" SuperAssembly.DLL"中。

最终,我认为这是没有意义的练习,并在每种情况下都用System.SuitableStandardException替换了所有" SuperExceptions"。我删除了对" SuperException.DLL"的引用,但是在尝试编译项目时遇到了以下问题:

The type 'SuperException' is defined in an assembly that is not referenced. You must add a reference to assembly 'SuperException, Version=1.1.0.0 (...)'

错误所引用的源文件似乎无关紧要。在IDE中突出显示的是项目名称空间。

现在,这是事情:

  • 项目代码中已消除了对" SuperException"的所有使用。
  • 与另一个编译好的没有引用" SuperException.DLL"的项目相比,我只引用了一个程序集,而" that"没有引用我的项目没有引用自身的内容。尽管这些依赖关系中的任何一个都可能抛出SuperExceptions,但我只是捕获了基本的Exception类,无论如何……其他项目都可以正常构建!
  • 我已经完成了Visual Studio的"清理解决方案",并多次手动清除了所有内容。

包括此参考不是世界末日,我只是不明白为什么它不再是必须的。 Nrrrgg。任何指针欢迎!

解决方案

回答

这听起来很奇怪。这是我接下来要检查的内容:

  • 检查Properties / AssemblyInfo.cs文件中是否有任何残留物。
  • 检查SuperUI.csproj文件中是否有任何残留物。
  • 删除所有引用,然后重新添加它们。

回答

由于这是编译器错误,因此在项目中的某处必须有SuperException的引用或者使用。

  • 在整个项目或者解决方案中针对该类型进行查找/替换,并删除所有引用(可能我们已经这样做了)。
  • 如果引用从SuperException继承的任何类型(即使在另一个程序集中定义的类型),则需要引用在其中定义了SuperException的程序集。

以编译器在其上显示错误的行为起点,并开始跟踪该行上使用的对象的继承树,我们可能会以此方式找到它的来源。

回答

尝试创建一个新项目,并向其中添加所有类。

回答

  • 退出Visual Studio
  • 删除解决方案目录中的bin和obj文件夹
  • 重新启动,看看会发生什么

回答

grep项目文件夹。它可以是项目中的隐藏引用,也可以是项目引用的项目。如果需要,用记事本清洁。

回答

到目前为止,感谢回答。我已经尝试了所有建议(除了一项建议)都无济于事。

我没有尝试过的建议是创建一个新项目并将所有内容添加到该项目中,这一想法确实考验了我的生活意志。 ;)如果可以的话,我明天可以试试。再次感谢。

回答

如今,关于VS项目,真的没有什么非常神秘的了,它是所有文本文件,等等。某些东西必须引用该类/ dll,并且某些东西必须包含在项目中。

我们是否真的对整个解决方案树(每个文件)都进行了引用或者查找,以引用该异常?

回答

我同意这里的其他评论。

过去,我曾遇到过类似的问题,其中搜索项目文件没有返回任何结果,原来是在其他文件中,这些文件并未在搜索中自动获取。

我不认为在这里创建新项目是解决方案。我们需要肯定的是,依赖项树中的所有引用都没有使用SuperException。

编辑:

我从来没有经历过这样的情况,即我确实需要擦除项目,我总是在某个地方找到参考。确保我们正在搜索每个文件。

回答

If you reference any types that inherits from SuperException (even if the type defined in another assembly), you need a reference to the assembly that SuperException is defined in.

只需添加一点,如果错误所指向的位置似乎是随机的,则通常可能意味着已编译的源代码和源代码文件之间不匹配。这是ASP.NET应用程序吗?我之前在ASP.NET temp文件夹中的重建中未替换编译的DLL的情况下,导致事情变得...。调试时很有趣:)

其次。

我们可能没有引用SuperException,但是可能引用了SpecializedSuperException,它是从SuperException派生而来,或者以其他方式使用了SuperException,因此我们对SuperException项目的grep不会被捕获。

回答

尝试使用NDepend试用

回答

为确保确定,在项目基础中的" grep -R SuperException *"(首先从某处获取" grep")。

这就是Resharper之类的工具真正发挥作用的地方-一个简单的Find Usages通常会多次告诉我这种"鬼依赖"。

回答

也许我们可以转到SuperException类的定义,然后尝试查找"所有引用()"。我们可能还想调查程序集SuperException是否对主程序集具有循环依赖关系(例如,主程序集依赖于异常程序集,而依赖于主程序集...)。

我认为这不是代码问题。我所看到的是,我们现有的引用之一可能依赖于我们可能在应用程序中创建的自己的类型中的该类型。

回答

如果是这种情况,即使我们没有显式使用类型,即使另一个引用的程序集都有其自己的引用,我们也确实需要该引用。有时我们会遇到第三方组件的问题,这些第三方组件需要引用尚未引用的类型。显然,编译器在我们现有的引用程序集之一中看到了某些内容,并希望我们引用了从属程序集。

这可能是可传递的引用,其中某些类型方法调用将返回一个盒装的SuperException实例(" downcast"),例如例外,但是通过检查传递包含的代码中的代码(即来自外部方法调用的代码),编译器知道我们需要能够在某个时候获得有关该类型的信息。

Resharper会告诉我们在什么情况下需要添加引用,并且可以使用Ltz Roeder的aka RedGate的Reflector来通过两种方式扫描编译的IL以获取对该类型的引用:1)使用搜索功能,2)打开我们正在使用的每种公共类型,以及需要" ghost"程序集的公共类型,都会要求我们指定其位置。

段落数量不匹配