C# .NET 中持久的程序集依赖问题

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的“清理解决方案”并手动清除了所有内容,多次尝试。
包含此引用并不是世界末日,我只是不明白为什么它现在还有必要。Nrrrgg。欢迎任何指针!
14个回答

3
很可能是一个传递引用,其中某个类型方法调用返回作为 Exception 的 SuperException 实例,但从检查传递包含的代码即你的外部方法调用的代码中,编译器知道你需要在某个时刻获取有关该类型的信息。
Resharper 会告诉您何时需要添加引用,您可以使用 Lütz Roeder 或 RedGate 的 Reflector 以两种方式扫描已编译的 IL,以查找对此类型的引用:1)使用搜索功能,2)打开您正在使用的每个公共类型,并针对那些需要“幽灵”程序集的类型,它将要求您指定其位置。
当我引用 Castle.Windsor 但未引用 Castle.MicroKernel 时,这种情况最常发生。 :p

2
  1. 退出Visual Studio
  2. 删除解决方案目录中的bin和obj文件夹
  3. 重新启动并查看结果

(说明:该段文字是关于清理Visual Studio项目缓存的步骤,建议在操作前备份相关文件)

2
我同意其他评论者的观点。在某个地方,有一个明文引用我曾经遇到过类似的问题,在项目文件中搜索时找不到任何内容,结果是在一些其他文件中,这些文件没有被自动搜索到。
我认为在这里创建一个新项目并不是解决方案。您需要确信您依赖树中没有一个引用了SuperException。没有一个 我从未遇到过需要彻底删除项目的情况,我总能在某个地方找到引用。确保您搜索了每个文件。

编辑:

补充一点,如果错误指向的位置似乎很随机,那通常意味着已编译源代码和源代码文件之间存在不匹配。这是ASP.NET应用程序吗?我曾经遇到过这种情况,在ASP.NET临时文件夹中重新构建时未替换已编译的DLL文件,导致调试时出现一些有趣的问题 :)

2
我认为这不是代码问题。我看到的情况是,您现有的引用之一可能依赖于自己在应用程序中创建的类型。
如果是这种情况,即使您没有显式使用该类型,其他已引用的程序集也具有其自己的引用,您仍然需要该引用。您有时会遇到第三方组件的问题,它们需要对您未引用的类型进行引用。编译器显然在您现有的某个已引用程序集中看到了某些东西,并期望您引用相关的程序集。

1
尝试使用Reflector搜索其他引用程序集中的SuperException,以验证它们是否在引用该程序集。 - cstick

1

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

  1. 在整个项目或解决方案中进行查找/替换该类型,并删除每个引用(可能您已经执行了此操作)。
  2. 如果您引用任何继承自SuperException的类型(即使该类型定义在另一个程序集中),则需要引用定义SuperException的程序集。

获取编译器显示错误的行,并开始跟踪该行中使用的对象的继承树,您可能会以此方式找到其源。


1
感谢您目前为止的回答。我已经尝试了每一个建议(除了一个),但都无济于事。
我没有尝试的建议是创建一个新项目并将所有内容添加到其中,这个想法真的考验我的生存意志。 ;) 如果我有心情,明天可能会尝试。再次感谢。

1

现在的VS项目并没有什么神秘的地方 - 它们都是文本文件等。一定有某些东西引用了那个类/ dll,而且那个东西必须是你的项目的一部分。

你真的已经在整个解决方案树中,每个文件中查找过对那个异常的引用了吗?


0

我曾经遇到过一个非常类似的程序集引用问题,当我的C#库依赖于C++/CLI程序集时就会出现这个问题。 问题在于我在C#程序集库中从那个C++/CLI程序集继承了一个公共类。这意味着继承链跨越了多个程序集。

我希望任何客户端都能够聪明地在C#库需要它时间接加载C++/CLI程序集,但即使在编译时也不是这样。

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

在你的代码中,你可能需要确保SuitableStandardException不继承自SuperException,以消除SuperException.DLL的引用。

使用封装而不是继承,并在你的新SuitableStandardException中创建一个SuperException数据成员。

如果这不能解决问题,你可能有更多的类跨越一些程序集的继承,在你的情况下是SuperAssembly.DLLsuperException.dll

如果你找不到所有的它们,可以尝试这个技巧:
SuperAssembly.DLL 中的所有公共成员和类设置为 internal。
SuperAssembly.DLL 中与 SuperException.DLL 交朋友:
[assembly:InternalsVisibleTo("SuperException, PublicKey=0024000004800000....)]

确保它们可以编译并从任何已引用 SuperException.DLL 的客户端中删除 SuperAssembly.DLL 引用。

0

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

  1. 检查您的 Properties/AssemblyInfo.cs 文件中是否有任何残留。
  2. 检查您的 SuperUI.csproj 文件中是否有任何残留。
  3. 删除所有引用并重新添加它们。

0

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


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