延续C#.NET中的程序集依赖性

时间:2008-08-12 19:35:45

标签: c# .net dependencies

我的C#项目 - 我们将其称为SuperUI - 用于使用外部程序集中的类。现在它没有,但编译器不会让我在没有汇编引用的情况下构建项目。让我详细说明一下。

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

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

  

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

的引用

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

现在,事情就是这样:

  1. SuperException的所有用法都已从项目代码中删除。
  2. 与另一个在没有引用SuperException.DLL的情况下编译好的项目相比,我只引用了一个程序集 - 而that引用了我的项目没有引用的任何内容。虽然这些依赖项中的任何一个都可能抛出SuperExceptions,但我只是捕获了基本的Exception类,并且无论如何......其他项目构建正常!
  3. 我已经完成了Visual Studio的“清洁解决方案”并多次手动清理所有内容。
  4. 包含此引用并不是世界末日,我只是不明白为什么它还有必要。 Nrrrgg。欢迎任何指示!

14 个答案:

答案 0 :(得分:3)

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

Resharper会告诉你需要添加引用的情况,你可以使用LützRoeder的又名RedGate的Reflector来扫描编译的IL,以便以两种方式引用这种类型:1)使用搜索工具, 2)打开你正在使用的每种公共类型,对于需要“幽灵”程序集的那种,它会要求你指定它的位置。

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

我同意这里的其他评论..有一个引用,用纯文本某处! 我在过去遇到类似的问题,搜索项目文件没有返回任何内容,结果发现它是在搜索中没有自动获取的其他文件中。

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

我从来没有经历过这个我需要逐字擦拭项目的地方,我总是找到某个地方的参考。确保您正在搜索每个文件。

编辑:

要添加一点,如果错误指向的位置似乎是随机的,那通常意味着编译源和源代码文件之间存在不匹配。这是一个ASP.NET应用程序吗?我之前已经知道编译的DLL没有在ASP.NET临时文件夹中的重建中被替换,导致事情变得有趣。调试时有趣:)

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

  1. 在该类型的整个项目或解决方案中查找/替换并删除每个引用(您可能已经这样做了)。
  2. 如果引用从SuperException继承的任何类型(即使在另一个程序集中定义的类型),则需要引用定义了SuperException的程序集。
  3. 获取编译器显示错误的行并开始跟踪该行上使用的对象的继承树,您可以通过这种方式找到它的来源。

答案 5 :(得分:1)

到目前为止,感谢您的回答。我尝试过每一个建议(除了一个)都无济于事。

我没有尝试的建议是创建一个新项目并添加我的所有东西,其中的想法真正测试了我的生活意愿。 ;)如果我感到困扰,我明天可以尝试这个。再次感谢。

答案 6 :(得分:1)

现在VS项目真的没有什么神秘之处 - 它是所有文本文件等.SOMETHING必须引用该类/ dll,并且某些东西必须是你项目的一部分。

您是否真的对整个解决方案树每个文件进行了grep'd或findtr,以获取对该异常的引用?

答案 7 :(得分:0)

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

  1. 检查Properties / AssemblyInfo.cs文件中没有任何遗留问题。
  2. 检查您的SuperUI.csproj文件中没有任何遗留问题。
  3. 删除所有引用并重新添加。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

  

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

借此。

您可能没有引用SuperException,但您可能正在引用SpecializedSuperException,它是从SuperException派生的,或以某种方式使用SuperException - 您{gre}的{{1}项目不会抓住它。

尝试对NDepend

的试用进行攻击

答案 11 :(得分:0)

这就是像Resharper这样的工具真正得到回报的地方 - 一个简单的查找用法通常会多次告诉我这种“幽灵依赖”。

也许您可以转到SuperException类的定义并尝试查找所有引用()。您可能还想调查程序集SuperException是否在主程序集上具有循环依赖(例如,主程序集依赖于异常程序集取决于主程序集......)。

答案 12 :(得分: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引用。

答案 13 :(得分:-1)

项目基础中的

grep -R SuperException *(首先从某处获取grep)只是为了确定。