【问题标题】:Clean Solution causes reference errors清洁解决方案导致参考错误
【发布时间】:2014-10-16 11:06:51
【问题描述】:

我曾尝试搜索以前提出的问题,但很难筛选它们,因为似乎 99% 指的是参考问题构建后,而我的问题是参考问题 干净后

问题如下,我正在恢复一个旧项目 - 不幸的是,我以前从未从事过这个项目 - 并且在我构建解决方案时一切都可以编译并且工作正常。

但是,当我执行清洁解决方案时,我会收到一个项目的参考错误。有问题的项目是 Visual Basic Web 服务项目。它引用了其他两个项目(它们是 C#),当我查看项目属性时,在“引用”窗格中,我看到用于引用的路径是 SolutionFolder\Project\bin\Debug\Projectname.dll。

所以每当我清理我的解决方案时,bin\Debug 都会被清空并且引用丢失。这是否意味着引用设置错误?

通过研究项目引用对 VB 项目的工作方式不同的问题,我了解到,但我觉得奇怪的是,当您清理解决方案时,C# 和 VB 项目的组合会出现引用错误。

谁能帮我/解释一下为什么会这样?


好的,我已经创建了重新创建问题的步骤。它的工作原理如下:

Visual Studio -> 新建项目 -> Visual Basic WCF 服务应用程序

解决方案 -> 添加 -> 新建项目 -> C# 类库

在类库中添加如下函数

namespace ClassLibrary1
{
    public class Class1
    {
        public static int Foo()
        {
            return 1;
        }
    }
}

Visual Basic WCF 项目 -> 添加 -> 参考 -> C# ClassLibrary(来自解决方案项目)

构建解决方案

在服务中,我将 GetData 函数更改如下:

Public Function GetData(ByVal value As Integer) As String Implements IService1.GetData
    Dim foo = ClassLibrary1.Class1.Foo

    Return String.Format("You entered: {0}", value)
End Function

构建解决方案

现在清洁解决方案。

Visual Studio 现在告诉我有引用错误。

重新构建。

错误消失了。

【问题讨论】:

    标签: c# vb.net visual-studio


    【解决方案1】:

    正如Maarten 所说,添加项目引用添加文件引用之间存在重要区别。我想更详细地解释一下 - 原始学分归 Maarten 所有!

    向程序集添加引用有多种不同的方法。有关详细信息,您可以查看 MSDN 文章 How to: Add or Remove References By Using the Reference Manager

    按照操作的要求,我们专注于文件和项目参考。我将展示 VS 如何保存参考设置以及它们对您的项目有什么影响!在我的示例中,我用三个项目(a、b 和 c)制作了一个解决方案。 项目 C 指的是 A 和 B。

    文件参考(浏览)

    正如我们所见,文件引用静态引用了硬盘上的文件。如果引用的文件不可用,您将收到损坏的引用警告。因此,当您清理解决方案时,任何已构建的程序集都将被清理。因此,您确实会收到警告。

    项目参考(解决方案 - 项目)

    引用项目会保存目标的项目 GUID。因此,在构建当前项目时,VS 会寻找目标项目并在必要时也构建它们


    这就是 MSDN 声明的原因:

    您应该避免将文件引用添加到另一个项目的输出中 在同一个解决方案中,因为这种策略可能会导致编译 错误。而是使用“参考管理器”对话框的“解决方案”选项卡 框以创建项目到项目的引用。这个战术让团队 通过更好地管理类,开发更容易 您在项目中创建的库。有关详细信息,请参阅 对损坏的引用进行故障排除。


    编辑

    由于您的项目包含不同的语言,VS 无法解析您的项目引用。您可能会看看这个similar SO question 在一个解决方案中处理两种语言。显然,虽然它是一个项目引用,但 VS 处理它就像一个文件引用。

    在 Visual Studio 中,several language services特定于语言的。因此,如果您从一个 C# 程序集引用另一个 C# 程序集,则相应的语言服务将在项目引用创建时处理任何潜在的引用错误。

    但如果您从 C# 引用 VB.net 程序集(或相反)没有“跨”语言服务。一个非常简单的例子是来自 c# 程序集的相关 <summary> tags 不会出现在 VB.net 项目中(如链接的问题/cmets 所述)。

    【讨论】:

    • 感谢您提供的清晰示例。我查看了项目文件,它实际上确实引用了项目,而不是 DLL 文件本身。
    • 也许你可以将你的项目/解决方案文件的相关部分,以便我可以重现你的问题
    • 我试图在一个干净的解决方案中重现该问题,但我得到了同样的错误,所以我添加了重现它的步骤到我的问题中。顺便说一句,我在 Visual Studio 2013 中工作,不确定这是否相关。非常感谢您的帮助!
    • 是的,我得出了同样的结论,谢谢你的努力
    【解决方案2】:

    我认为现在将引用设置为bin\debug 文件夹中的物理 dll 文件,而不是构建该 dll 文件的项目。

    如果您设置对物理 dll 文件的引用,Visual Studio 将始终期望该文件存在,否则它会报错。

    如果您设置对构建 dll 文件的项目的引用,Visual Studio 将查看该项目,并且该项目将始终存在。 Visual Studio 不会抱怨缺少 dll 文件,因为它对 dll 文件的引用不感兴趣。

    删除您现在拥有的引用,并创建一个指向项目而不是 dll 文件的新引用。

    【讨论】:

    • 好答案,我在新答案中添加了更多细节 - 参考你的!
    • 感谢您的回答 Maarten,正如我对 Pilgerstorfer Franz 的评论一样,我已添加步骤以重现我的问题中的错误。
    【解决方案3】:

    您的项目依赖项是否在此 Visual Basic 项目上正确设置。

    您可以通过右键单击Solution Explorer 中的项目并转到Project Dependencies 来指定依赖项。确保在此处选中您引用的其他两个项目。

    另外,您能否检查一下 Visual Basic 项目引用的两个项目在 Debug 配置的 Configuration Manager 窗口中是否设置为 Build。

    【讨论】:

    • 谢谢,我已经仔细检查了这些设置,据我所知它们设置正确。如果您仍然有兴趣查看问题,我已经添加了重现问题的步骤
    【解决方案4】:

    感谢大家快速明确的回答。

    我已经尝试了解决方案并进行了更多搜索,但我还没有解决问题,感觉这篇文章最适合我的情况:

    https://stackoverflow.com/a/3989670/3895498

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      相关资源
      最近更新 更多