8

我的 C# 项目——我们称之为 SuperUI——用于使用来自外部程序集的类。现在它没有,但编译器不会让我在没有适当的程序集引用的情况下构建项目。让我详细说明。

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

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

“SuperException”类型是在未引用的程序集中定义的。您必须添加对程序集 'SuperException, Version=1.1.0.0 (...)' 的引用

错误引用的源文件似乎不相关;它是在 IDE 中突出显示的项目名称空间。

现在,事情是这样的:

  1. SuperException项目代码中已经消除了 的所有使用。
  2. 与另一个在没有引用的情况下编译良好的项目相比SuperException.DLL,我只引用了一个程序集 - 并且that没有引用我的项目不引用自身的任何内容。虽然这些依赖项中的任何一个都可能抛出SuperExceptions,但我只捕获了基本的 Exception 类,无论如何......另一个项目构建得很好!
  3. 我已经完成了 Visual Studio 的“清洁解决方案”并多次手动清除所有内容。

包括这个参考并不是世界末日,我只是不明白为什么它是必要的。Nrrgg。欢迎任何指点!

4

14 回答 14

3

它可能是一个传递引用,其中某些类型方法调用返回一个装箱的 SuperException 实例(“向下转换”),例如异常,但是通过检查传递包含的代码中的代码,即来自外部方法调用的代码,编译器知道你需要能够在某个时候获得有关该类型的信息。

Resharper 会告诉您在什么情况下需要添加引用,您可以使用 Lütz Roeder 的又名 RedGate 的 Reflector 以两种方式扫描编译后的 IL 以获取对该类型的引用:1)使用搜索工具,2)打开您使用的每种公共类型以及需要“ghost”程序集的公共类型,它都会要求您指定其位置。

当我引用 Castle.Windsor 而不是 Castle.MicroKernel 时,这最常发生在我身上。:p

于 2009-02-18T02:23:00.040 回答
2
  1. 退出 Visual Studio
  2. 删除解决方案目录中的 bin 和 obj 文件夹
  3. 重新启动,看看会发生什么
于 2008-08-12T19:56:41.227 回答
2

我同意这里的其他评论。有一个参考,在某处纯文本!过去我遇到过类似的问题,在项目文件中搜索什么也没有返回,结果发现它在搜索中没有自动找到的其他文件中。

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

我从来没有经历过这种情况,以至于我需要从字面上擦除项目,我总是在某处找到参考。确保您正在搜索每个文件。

编辑:

需要补充一点,如果错误指向的位置看起来是随机的,这通常意味着编译的源代码和源代码文件之间存在不匹配。这是一个 ASP.NET 应用程序吗?我以前在 ASP.NET 临时文件夹中的重建中没有替换编译的 DLL 导致事情得到解决。调试时很有趣 :)

于 2008-08-12T21:41:46.053 回答
2

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

如果是这种情况,即使您没有显式使用该类型并且即使其他引用的程序集有自己的引用,您也确实需要该引用。您有时会遇到需要引用您未引用的类型的第 3 方组件的问题。编译器显然在您现有的一个引用程序集中看到了一些东西,并希望您引用从属程序集。

于 2008-08-21T14:11:02.750 回答
1

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

  1. 在整个项目或解决方案中查找/替换该类型并删除所有引用(您可能已经这样做了)。
  2. 如果您引用任何继承自 SuperException 的类型(即使是在另一个程序集中定义的类型),您需要对定义 SuperException 的程序集的引用。

选择编译器显示错误的行并开始跟踪该行上使用的对象的继承树,您可能会以这种方式找到它的来源。

于 2008-08-12T19:48:52.287 回答
1

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

我没有尝试过的建议是创建一个新项目并将我所有的东西都添加到其中,这个想法真的很考验我的生活意愿。;) 如果我能打扰的话,我明天可以试试这个。再次感谢。

于 2008-08-12T20:38:39.597 回答
1

如今,VS 项目确实没有什么非常神秘的东西——都是文本文件等。某些东西必须引用该类/dll,并且某些东西必须是您项目的一部分。

您是否真的 grep'd 或 findstr'd 整个解决方案树,每个文件,以引用该异常?

于 2008-08-12T20:46:22.763 回答
0

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

  1. 检查您的 Properties/AssemblyInfo.cs 文件中是否没有任何东西挥之不去。
  2. 检查您的 SuperUI.csproj 文件中是否有任何残留。
  3. 删除所有引用并重新添加它们。
于 2008-08-12T19:46:51.403 回答
0

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

于 2008-08-12T19:51:10.737 回答
0

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

于 2008-08-12T20:06:20.740 回答
0

如果您引用任何继承自 SuperException 的类型(即使是在另一个程序集中定义的类型),您需要对定义 SuperException 的程序集的引用。

对此表示赞同。

您可能没有引用SuperException,但您可能正在引用SpecializedSuperException,它源自或以其他方式使用SuperException- 您的项目的 grepSuperException不会捕获它。

尝试通过试用NDepend进行破解

于 2008-08-12T21:49:16.070 回答
0

这就是像Resharper这样的工具真正发挥作用的地方——一个简单的 Find Usages 通常会多次告诉我这种“幽灵依赖”。

也许您可以转到 SuperException 类的定义并尝试 Find All References()。您可能还想调查程序集 SuperException 是否对您的主程序集具有循环依赖关系(例如,主程序集取决于异常程序集取决于主程序集......)。

于 2008-08-13T01:05:29.980 回答
0

当我的 C# 库具有依赖的 C++/CLI 程序集时,我遇到了一个非常相似的程序集引用问题。问题是我从我的 C# 程序集库中的 C++/CLI 程序集继承了一个公共类。这意味着继承链跨越多个程序集。

我希望任何客户端都足够聪明,可以在 C# 库需要它的任何时候间接加载 C++/CLI 程序集,但即使在编译时也并非如此。

我通过打破跨越这两个程序集库的类之间的继承并改用聚合来解决这个问题。我的客户终于高兴了,不再需要 C++/CLI 程序集作为依赖项。

用您的话来说,您可能必须确保SuitableStandardException不继承自SuperException以消除SuperException.DLL作为参考。

使用封装而不是继承,并SuperException在新的 SuitableStandardException.

如果这不能解决它,您可能有更多类跨越某些程序集的继承,在您的情况下SuperAssembly.DLLsuperException.dll.

如果找不到所有这些,请尝试以下技巧:

  1. 使您的所有公共成员和类都在SuperAssembly.DLL内部。

  2. 在 SuperAssembly.DLL 中与SuperException.DLL

    [assembly:InternalsVisibleTo("SuperException, PublicKey=0024000004800000....)]
    
  3. 确保他们SuperAssembly.DLL从已经引用的任何客户端构建和删除引用SuperException.DLL

于 2011-04-22T21:10:18.867 回答
-1

grep -R SuperException *在你的项目的基础上(grep首先从某个地方获取)只是为了确定。

于 2008-08-13T00:29:42.343 回答