【问题标题】:Debugging error "The Type 'xx' is defined in an assembly that is not referenced"调试错误“类型 'xx' 在未引用的程序集中定义”
【发布时间】:2010-12-16 06:14:34
【问题描述】:

完整的错误如下:

类型 'System.Windows.Forms.Control' 是 在未定义的程序集中定义 参考。您必须添加参考 组装'System.Windows.Forms, 版本=2.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089'。

它指向不需要System.Windows.Forms(或者我认为)的库项目中第一个类中的第一个语句(Debug.Assert 行)。我知道如何解决它:添加提到的参考。但是如何找出导致此错误的库,或者更好的是,使用 WinForms 库触发的代码的哪一部分?

通常,您可以添加引用其他库的库,但您只需要在实际使用这些其他库时添加对它们的引用。


编辑:替代解决方案

也可以使用 Microsoft 框架工具中的 Binding Log Viewer Fuslogvw.exe 解决此问题或类似问题。它显示了您的应用程序绑定到的程序集的所有尝试和成功。

【问题讨论】:

    标签: c# visual-studio-2008 debugging assembly-resolution


    【解决方案1】:

    使用 NDepend 或 Reflector 或对象浏览器之类的东西来检查您所依赖的程序集的依赖关系。

    鉴于以上信息,我想不出任何其他方式。

    【讨论】:

    • 这也是我目前想到的方式,但它要么太粗糙(NDepent)要么太颗粒化(Reflector)。我还可以回滚我的代码更改,直到错误出现的那一刻,这将显示导致此错误的行。我希望有别的东西。
    【解决方案2】:

    我怀疑您的代码中没有导致此问题的行,因为您说您没有使用 System.Windows.Forms 类型并且编译器错误未指向您的代码的(有用的)行。

    我认为正在发生的事情是,您正在引用一个库,该库具有一个公开可见的方法或属性,该方法或属性要么返回 System.Windows.Forms.Control,要么将其作为参数。不管你是否真的调用那个方法/属性,它公开可见的事实意味着你自己的代码必须能够解析库正在使用的所有类型。如果库仅在内部使用 System.Windows.Forms,您将不会遇到这种情况。

    这也意味着仅查看您所依赖的程序集的依赖关系可能只会缩小嫌疑人列表,因为可能有一些程序集在内部依赖于 System.Windows.Forms(没问题)和一个具有来自 SWForms 程序集的类型的公共参数/返回值的故障排除程序集。

    我的建议是你直接建立一个空项目,不引用 S.W.Forms,然后依次添加你的每个依赖项,然后尝试在每个依赖项之后编译。

    【讨论】:

    • 这证明是正确的:有一个引用的库有一个被限制为Control 的通用方法,但没有以任何方式使用。我知道可能的原因,我只是希望找到一个“直接”的方法来找到罪魁祸首。我这次用的是简单的推演(回滚直到问题出现)
    • 我不确定是否有一种简单的方法可以识别罪魁祸首,除了您的建议(回滚)或我的建议(设置一个测试用例项目并一次添加一个依赖项,直到它无法编译) . .NET 程序集的清单包含它所依赖的所有其他程序集的详细信息,但没有任何内容说“如果您引用此程序集,您还需要引用该程序集”。任何解决此问题的工具都必须使用反射来检查您正在查看的程序集中每个方法的所有返回值和参数的类型 - 这是一项非常具体的任务。
    【解决方案3】:

    我有同样的错误。

    问题是我使用了一个项目的引用,该项目内部使用了 System.Windows.Forms。

    解决方案是在您的项目中也添加对 System.Windows.Forms 的引用。

    【讨论】:

    • 是的,这就是我在原始问题中所写的内容。真正的问题是,如何在可能数百或数千个被引用项目中找到需要引用的项目。
    猜你喜欢
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2014-09-17
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多