【问题标题】:Successful Visual Studio C# build does not create assembly成功的 Visual Studio C# 构建不会创建程序集
【发布时间】:2009-02-18 10:05:29
【问题描述】:

我正在使用 Visual Studio 2005、.NET 2.0

我还不确定在什么情况下会发生这种情况,但情况如下: 我有一个项目结构如下的解决方案:一个库项目 Foo,一个引用 Foo 的库项目 Bar,以及一个引用 Foo 和 Bar 的库项目 Quux。

编译失败并出现错误消息“无法找到元数据文件 'Foo.dll'”,来自 Bar,“找不到元数据文件 'Foo.dll'”和“无法找到元数据文件 'Bar.dll'来自 Quux。

查看我的目标目录(我有一个包含所有 3 个项目的组合目标目录),它是空的,所以根本没有编译任何项目。现在,如果 Foo 没有输出,我可以让 Bar 和 Quux 失败。问题是:为什么 Foo 静默失败?它没有错误,只构建 Foo 而不是整个解决方案就可以正常工作。

“有趣”的是,再次按下构建按钮后,出现 Foo.dll 文件,Bar 不再抱怨但也不产生任何输出文件,Quux 抱怨缺少 Bar.dll。再次按下按钮,出现 Bar.dll,没有更多错误但没有 Quux.dll。再次按下按钮后,Quux.dll 再次出现,没有错误。

项目依赖项都设置正确,解决方案构建顺序完全正确。

我什至尝试过创建一个新的解决方案和新的项目文件,然后再次将源添加到这些文件中。也没有欢乐。同样的事情也会发生。

我完全被难住了。有谁知道摆脱这种混乱的方法吗?

【问题讨论】:

  • 我仍然建议您获得 Visual Studio 2008 并以 2.0 开发为目标,尽管人们对我的回答持臭名昭著的立场。 VS2005 有错误 VS2008 没有。很可能只需重新安装即可解决此问题。

标签: c# .net visual-studio-2005 build-process


【解决方案1】:

每个项目都应该有单独的输出目录。每次构建项目时,它都会清除输出目录,因此不会找到下一个项目的任何依赖项。

不要担心丢失任何 DLL,它们会被复制到需要它们的每个 bin 目录中。

【讨论】:

    【解决方案2】:

    我认为解决您的问题的方法可能是使用构建后事件删除以前版本的 dll 并将新版本复制到您的组合目标目录。

    当您设置三个项目以这种方式工作时,您会发现您正在将每个项目编译到其对应的 bin 文件夹和组合的目标目录中。如果您决定使用它,您应该做的第二件事是为您的解决方案中的每个项目设置一个指向组合目标目录的参考路径。编译顺序必须仍然存在。

    这样每次编译时,每个项目的 dll 都会在合并的目标目录中找到。

    虽然,这个解决方案有它自己的问题,比如构建后的事件忘记正常工作;但很少见。

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      问题在于构建顺序。如果某个项目依赖于另一个项目,则必须首先构建第二个项目。在解决方案属性中使用构建依赖项来克服这个问题。

      【讨论】:

      • 我已经写过:“项目依赖项都设置正确,解决方案构建顺序说的完全正确。”
      • 他们真的按照这个顺序构建吗(至少尝试一下)?
      • 是的。 Foo,然后是 Bar,然后是 Quux。 Foo 说它已编译,Bar 和 Quux 由于缺少 Foo 而失败。并且目标目录中没有Foo。
      • 那么我猜有一些步骤会删除程序集。尝试为每个项目的结果使用单独的目录。添加自定义构建步骤以将程序集复制到必要的公共文件夹中,以便在需要时将它们全部放在一个位置。
      • 您是否可能在任何项目中使用了构建后事件,以便将 dll 复制到您的组合目标目录?
      【解决方案4】:

      检查您的构建顺序,以便一切看起来都在那里.. 尝试运行一个干净的解决方案并重新构建,这是什么时候发生的?

      【讨论】:

        【解决方案5】:

        将您的项目文件拖入记事本并使用“导入”标签查找 并用这个替换那个标签

        Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" 
        

        它应该可以工作

        【讨论】:

          【解决方案6】:

          不知什么原因,这发生在我早上工作中使用 Visual Studio 2013 的时候。一个构建,它正在更新 dll,下一个,它只是没有,即使构建似乎进展顺利。我最终通过删除现有的 dll 解决了这个问题。由于没有预先存在的 dll,构建必须提供一个新的。

          【讨论】:

            【解决方案7】:

            我同意每个项目都应该有自己的目标目录。我试着用这个变得可爱,但它总是比我试图解决的任何问题造成更多的麻烦。

            我有一个 vs19 , 5 个项目的解决方案。我刚刚添加了一个新的控制台应用程序。这个应用程序突然开始编译而没有抱怨,但没有产生文件。依赖它的单元测试项目报错了。

            我照常做

            • 清理/重建
            • 按顺序清理/重建每个项目
            • 检查项目依赖和构建顺序
            • 重新启动 vis studio(知道它的 2020 年,我仍然需要重新启动 vs 有时)

            面对刚刚创建一个新项目的前景,我决定尝试另一件事

            1. 删除了对其他项目的所有引用
            2. 注释掉所有依赖这些的代码。

            我留下了一个返回 0 的 main() 这个编译和生成的文件

            1. 我一个接一个地添加了引用,直到一切都在那里。
            2. 取消注释代码。

            在这个练习结束时,一切都奏效了。

            我不能告诉你发生了什么变化。 以为我会提供此作为故障排除方法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-08-18
              • 1970-01-01
              • 1970-01-01
              • 2019-04-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多