题
我的 C# 项目 - 我们将其称为 SuperUI - 用于使用外部程序集中的类。现在没有,但是编译器不会让我在没有程序集引用的情况下构建项目。让我详细说明一下。
该项目用于抛出和捕获自定义异常类 - SuperException
- 它派生自标准 System.Exception 并存在于单独的预编译程序集中, SuperAssembly.DLL
, ,我参考过。
最终,我认为这是一个毫无意义的练习,并更换了所有 SuperExceptions
在每种情况下都会出现 System.SuitableStandardException。我删除了对 SuperException.DLL
, ,但现在在尝试编译该项目时遇到了以下问题:
类型“SuperException”是在未引用的程序集中定义的。您必须添加对程序集“SuperException,Version=1.1.0.0 (...)”的引用
错误引用的源文件似乎不相关;它是在 IDE 中突出显示的项目命名空间。
现在,事情是这样的:
- 所有用途
SuperException
已从项目代码中删除。 - 与另一个无需引用即可编译良好的项目相比
SuperException.DLL
, ,我只引用了另外一个程序集 - 并且that
不引用我的项目未引用的任何内容。虽然这些依赖项中的任何一个都可能会抛出SuperExceptions
, ,我只捕获基本 Exception 类,无论如何......另一个项目构建得很好! - 我已经多次完成了 Visual Studio 的“清理解决方案”并手动清除了所有内容。
包含此引用并不是世界末日,我只是不明白为什么还有必要。嗯嗯。欢迎任何指点!
解决方案
它可能是一个传递引用,其中某些类型方法调用返回一个装箱的 SuperException 实例(“向下转型”),例如例外,但来自检查传递包含的代码中的代码,即当您从外部方法调用中获取代码时,编译器知道您需要在某个时刻获得有关该类型的信息。
Resharper 会告诉您在哪里需要添加引用,并且您可以使用 Lütz Roeder 又名 RedGate 的 Reflector 以两种方式扫描已编译的 IL 以获取对此类型的引用:1)使用搜索工具,2)打开您正在使用的每个公共类型,对于需要“幽灵”程序集的公共类型,它会要求您指定其位置。
当我引用 Castle.Windsor 而不是 Castle.MicroKernel 时,这种情况最常发生在我身上。:p
其他提示
- 退出 Visual Studio
- 删除解决方案目录中的 bin 和 obj 文件夹
- 重新启动并看看会发生什么
我同意这里的其他评论..有一个参考,纯文本 某处 !我过去也遇到过类似的问题,搜索项目文件没有返回任何结果,结果发现它位于其他一些文件中,而在搜索中没有自动获取。
我不认为创建一个新项目是这里的解决方案。你需要积极地认为 没有任何 依赖树中的引用使用 SuperException.. 没有任何
我从来没有经历过这种情况,以至于我需要从字面上擦除该项目,我总是在某处找到参考。确保您正在搜索 每一个 文件。
编辑:
只是要补充一点,如果错误指向的位置看起来是随机的,这通常意味着编译的源代码和源代码文件之间存在不匹配。这是 ASP.NET 应用程序吗?我以前遇到过这样的情况,在 ASP.NET 临时文件夹中重建时,编译后的 DLL 没有被替换,导致事情变得..调试时很有趣:)
我不认为这是代码问题。我所看到的情况是,您现有的引用之一可能依赖于您可能在应用程序中创建的自己类型中的该类型。
如果是这种情况,即使您没有显式使用该类型,并且即使其他引用的程序集有自己的引用,您也确实需要该引用。有时您会遇到第 3 方组件的问题,这些组件需要引用您未引用的类型。编译器显然在现有引用的程序集之一中看到了某些内容,并期望您引用依赖的程序集。
由于这是编译器错误,因此项目中的某个地方必须引用或使用 SuperException。
- 在整个项目或解决方案中对该类型进行查找/替换,并删除每个引用(您可能已经这样做了)。
- 如果引用从 SuperException 继承的任何类型(即使是在另一个程序集中定义的类型),则需要对定义 SuperException 的程序集的引用。
获取编译器显示错误的行并开始跟踪该行上使用的对象的继承树,您可能会通过这种方式找到它的来源。
感谢您迄今为止的回答。我已经尝试了所有建议(除了一个),但均无济于事。
我没有尝试过的建议是创建一个新项目并将我所有的东西添加到其中,这个想法真的很考验我的生存意志。;)如果我能打扰的话,我明天可以试试这个。再次感谢。
如今 VS 项目确实没有什么神秘之处——都是文本文件等。某些东西必须引用该类/dll,并且某些东西必须是您的项目的一部分。
你真的 grep'd 或 findstr'd 整个解决方案树吗? 每个文件, ,以参考该异常?
这听起来很奇怪。这是我接下来要检查的内容:
- 检查 Properties/AssemblyInfo.cs 文件中是否没有任何残留内容。
- 检查 SuperUI.csproj 文件中是否没有任何残留内容。
- 删除所有引用并重新添加它们。
尝试创建一个新项目,并将所有类添加到其中。
grep 你的项目文件夹。它可能是项目中的隐藏引用,或者是您的项目引用的项目。如果需要,用记事本清洁。
如果引用从 SuperException 继承的任何类型(即使是在另一个程序集中定义的类型),则需要对定义 SuperException 的程序集的引用。
对此表示附议。
你可能没有引用 SuperException
, ,但你可能会引用 SpecializedSuperException
, ,它源自或以其他方式使用 SuperException
- 你的项目 grep SuperException
但不会抓住它。
尝试进行破解 依赖型
这就是像这样的工具的地方 雷夏珀 确实有回报——一个简单的“查找用法”通常会多次告诉我这种“幽灵依赖性”。
也许您可以转到 SuperException 类的定义并尝试查找所有引用()。您可能还想调查程序集 SuperException 是否具有 循环依赖 在您的主程序集上(例如,主程序集取决于异常程序集取决于主程序集...)。
当我的 C# 库具有依赖的 C++/CLI 程序集时,我遇到了非常类似的程序集引用问题。问题是我从 C# 程序集库中的 C++/CLI 程序集继承了一个公共类。这意味着继承链跨越多个程序集。
我希望任何客户端都足够聪明,可以在 C# 库需要时间接加载 C++/CLI 程序集,但即使在编译时也并非如此。
我通过打破跨越这两个程序集库的类之间的继承并使用聚合来解决这个问题。我的客户终于很高兴,不再需要 C++/CLI 程序集作为依赖项。
用你的话来说,你可能必须确保 SuitableStandardException
不继承自 SuperException
为了消除 SuperException.DLL
作为参考。
使用封装而不是继承并创建一个 SuperException
新的数据成员 SuitableStandardException
.
如果这不能解决问题,在您的情况下,您可能有更多的类跨越某些程序集的继承 SuperAssembly.DLL
和 superException.dll
.
如果你找不到所有这些,请尝试以下技巧:
使所有公共成员和类都在
SuperAssembly.DLL
内部的。在 SuperAssembly.DLL 中交朋友
SuperException.DLL
:[assembly:InternalsVisibleTo("SuperException, PublicKey=0024000004800000....)]
确保他们构建和删除
SuperAssembly.DLL
来自任何已引用的客户的引用SuperException.DLL
.
grep -R SuperException *
在您的项目的基础上(获取 grep
首先从某个地方)只是为了确定。