【问题标题】:"Unable to update dependencies of the project" after committing to Subversion提交到 Subversion 后“无法更新项目的依赖项”
【发布时间】:2011-03-15 01:44:12
【问题描述】:

我在 .NET 中有一个安装项目。当我将项目和其他项目保存到颠覆时,安装项目不再编译。我收到错误“无法更新项目的依赖项”。

【问题讨论】:

    标签: winforms deployment dependencies setup-project


    【解决方案1】:

    在 MSDN 上有一个很长的 discussion 线程。似乎有很多可能的原因。讨论包括来自 Microsoft 的有关此问题的一些链接。 Here is a hotfix 用于 VS2005,here is a workaround 用于 VS2010。

    【讨论】:

    • “删除然后再次添加项目”方法对我有用。
    • +1 我必须在 .VDPROJ 文件中手动修复依赖路径。看看我的回答可能会赢得一些时间。修补程序根本没有帮助。
    • +1 到 radbyx。您的简单评论可能为我节省了一个小时的挫败感:)
    • 重新启动也为我修复了它。谢谢 radbyx!
    • 关闭解决方案,然后重新打开。这对我有用:-)
    【解决方案2】:

    我遇到了类似的问题,并在MSDN 上这个非常长且古老的讨论中找到了解决方法。
    正如用户“Jeff Hunsaker”在 2010 年 8 月 26 日星期四下午 5:51 回答的那样(无法直接链接):

    我刚刚在将 Visual Studio 2008 部署项目升级到 VS 2010 时遇到了这个问题。Hans(上图)的解决方案对我有用。

    1. 在记事本中编辑 .vdproj 文件。
    2. 搜索“SourcePath”=“8:
    3. 对于每个程序集/dll,提供完整路径
    4. 保存文件

    在我的 .vdproj 文件中,我有几个条目只是引用了程序集:
    "SourcePath" = "8:MyAssembly.DLL"

    即使 Visual Studio [不知何故] 知道文件位置,在我提供完整路径之前,我还是收到了“无法更新项目的依赖项”错误:

    "SourcePath" = "8:..\..\..\build\bin\MyCompany.MyAssembly.DLL"

    问候,

    杰夫...

    我注意到 Visual Studio 报告了哪些依赖项,并编写了一个脚本来修复它们,以备不时之需。

    请注意,现在这会给我一个警告“两个或多个对象具有相同的目标位置 ('[targetdir]\MyAssembly.dll')。但我可以忍受。

    【讨论】:

      【解决方案3】:

      我也遇到过同样的问题,但上述解决方案似乎都不适合我。重新构建设置项目是可行的,但很痛苦,因为我们包含了 30 多个项目的项目输出。

      我发现可行的方法与 @Marc 所做的方法非常相似。

      1. 我注意到 Visual Studio 将哪些依赖项报告为错误
      2. 在 Notepad++ 中编辑 .vdproj 文件
      3. 搜索出现问题的 .dll。您将看到“ScatterAssemblies”部分。如果为空,则删除整个 dll 引用
      4. 保存文件

      在所有情况下,我都多次引用同一个 dll(不确定这是怎么发生的)

      正确参考示例:

      "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_11EC89A306FFB83A269ACC2BF8D8462B"
      {
      "AssemblyRegister" = "3:1"
      "AssemblyIsInGAC" = "11:FALSE"
      "AssemblyAsmDisplayName" = "8:Some.OrOther.Lib, Version=1.601.4042.16978, Culture=neutral, processorArchitecture=MSIL"
                      "ScatterAssemblies"
                      {
                                      "_11EC89A306FFB83A269ACC2BF8D8462B"
                                      {
                                      "Name" = "8:Some.OrOther.Lib.dll"
                                      "Attributes" = "3:512"
                                      }
                      }
      "SourcePath" = "8:Some.OrOther.Lib.dll"
      "TargetName" = "8:"
      "Tag" = "8:"
      "Folder" = "8:_79891234C744498C83755DDEA682F0BF"
      "Condition" = "8:"
      "Transitive" = "11:FALSE"
      "Vital" = "11:TRUE"
      "ReadOnly" = "11:FALSE"
      "Hidden" = "11:FALSE"
      "System" = "11:FALSE"
      "Permanent" = "11:FALSE"
      "SharedLegacy" = "11:FALSE"
      "PackageAs" = "3:1"
      "Register" = "3:1"
      "Exclude" = "11:FALSE"
      "IsDependency" = "11:TRUE"
      "IsolateTo" = "8:"
      }
      

      错误引用示例:

      "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_11EC89A306FFB83A269ACC2BF8D8462B"
      {
      "AssemblyRegister" = "3:1"
      "AssemblyIsInGAC" = "11:FALSE"
      "AssemblyAsmDisplayName" = "8:Some.OrOther.Lib, Version=1.601.4042.16978, Culture=neutral, processorArchitecture=MSIL"
                      "ScatterAssemblies"
                      {
                      }
      "SourcePath" = "8:Some.OrOther.Lib.dll"
      "TargetName" = "8:"
      "Tag" = "8:"
      "Folder" = "8:_79891234C744498C83755DDEA682F0BF"
      "Condition" = "8:"
      "Transitive" = "11:FALSE"
      "Vital" = "11:TRUE"
      "ReadOnly" = "11:FALSE"
      "Hidden" = "11:FALSE"
      "System" = "11:FALSE"
      "Permanent" = "11:FALSE"
      "SharedLegacy" = "11:FALSE"
      "PackageAs" = "3:1"
      "Register" = "3:1"
      "Exclude" = "11:FALSE"
      "IsDependency" = "11:TRUE"
      "IsolateTo" = "8:"
      }
      

      我也得到了与@Marc 相同的“两个或多个对象具有相同的目标位置 ('[targetdir]\MyAssembly.dll')”警告..​​....但安装项目编译并运行良好。

      【讨论】:

      • 我最终删除了所有 File 程序集引用。完美运行。
      • 这个,很多次。我一直在努力解决这些错误,但建议的其他修复都没有奏效。
      • 删除整个文件部分内容时,这对我有用。
      【解决方案4】:

      VS2010 热修复的正确链接是:

      http://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=30681

      安装后可以正常使用

      【讨论】:

      • 这对我有用。重新启动 VS 并编辑 .vdproj 没有。
      • Microsoft Connect 已停用,上面的链接将我们带到一个页面,该页面不会费心告诉此修补程序现在的位置。
      【解决方案5】:

      关闭 VS2010 然后重新打开它一直对我有用 :)

      【讨论】:

      • 你先生,真棒。
      • 我用谷歌搜索了这个问题,来到这里并看到我已经对这个答案投了赞成票,这告诉我这可能对我有用。确实如此。
      • 你先生,又一次很棒!
      【解决方案6】:

      这为我解决了同样的问题: 我将错误消息中提到的程序集添加到 GAC。当我重新编译项目时,dll 出现在解决方案资源管理器的“检测到的依赖项”下,我得到了同样的错误。然后我排除了dll(右键选择排除),项目终于编译好了。

      【讨论】:

        【解决方案7】:

        以下是一些可行的解决方案:

        1) 从安装项目中删除一个有问题的 DLL,然后重新添加一个为我解决了问题的 DLL。即使有许多 DLL 存在问题,这也有效。删除和添加其中一个会触发 VS2010 以某种方式修复它们。

        2) 重建解决方案,然后再次尝试更新依赖项。重建帮助 Visual Studio 发现依赖项是什么,因为它可能很难找到没有构建的依赖项。

        3) 重启 Visual Studio

        上面链接的 VS2010 修补程序对我不起作用。有时重新启动 VS2010 会解决问题,当它不起作用时,执行上述工作。

        【讨论】:

          【解决方案8】:

          该问题可能是由 .vdproj 文件的“可部署”->“文件”部分中的孤立文件引起的。您可以通过从 Visual Studio 中的安装项目中删除所有文件来验证这一点(首先进行备份)。如果您使用文本编辑器打开 .vdproj 文件,但仍然在“文件”部分中看到条目,则您遇到了这个问题。您可以记下这些文件的密钥并将它们从原始 .vdproj 文件中删除,它应该会再次工作。

          或者编译这个快速修复程序(仅使用 Visual Studio 2010 测试):

          using System;
          using System.Collections.Generic;
          using System.Text;
          using System.IO;
          
          class Program {
              static void Main(string[] args) {
                  try {
                      if (args.Length == 0) {
                          Console.WriteLine("FixVDProj <path to .vdproj file>");
                          return;
                      }
          
                      if (!File.Exists(args[0])) {
                          throw new Exception("File " + args[0] + " does not exist!");
                      }
          
                      string[] strarSource = File.ReadAllLines(args[0]);
                      List<string> listDest = new List<string>();
                      List<string> listKnownKeys = new List<string>();
          
                      int iSection = 0;
                      bool bAccept = true;
                      bool bNeedFix = false;
          
                      foreach (string strLine in strarSource) {
                          switch (iSection) {
                              case 0:
                                  if (strLine.Trim() == "\"DeployProject\"") {
                                      listDest.Add(strLine);
                                      iSection++;
                                  } else {
                                      throw new Exception("\"DeployProject\" not found");
                                  }
                                  break;
          
                              case 1:
                                  if (strLine.Trim() == "\"Hierarchy\"") {
                                      iSection++;
                                  }
                                  listDest.Add(strLine);
                                  break;
          
                              case 2:
                                  if (strLine.Trim().StartsWith("\"MsmKey\" = ")) {
                                      int p = strLine.IndexOf('=');
                                      string strMsm = strLine.Substring(p + 1).Trim();
                                      if (strMsm.StartsWith("\"8:") && strMsm.EndsWith("\"")) {
                                          listKnownKeys.Add(strMsm.Substring(3, strMsm.Length - 4));
                                      } else {
                                          throw new Exception("Invalid MsmKey " + strMsm);
                                      }
                                  } else if (strLine.Trim() == "\"Deployable\"") {
                                      iSection++;
                                  }
                                  listDest.Add(strLine);
                                  break;
          
                              case 3:
                                  if (strLine.Trim() == "\"File\"") {
                                      iSection++;
                                  }
                                  listDest.Add(strLine);
                                  break;
          
                              case 4:
                                  if (strLine.Trim() == "{") {
                                      iSection++;
                                  }
                                  listDest.Add(strLine);
                                  break;
          
                              case 5:
                                  if (strLine.Trim() == "}") {
                                      listDest.Add(strLine);
                                      iSection = -1;  // finished
                                  } else if (strLine.Trim().StartsWith("\"") && strLine.Contains(':')) {
                                      int p = strLine.IndexOf(':');
                                      string strKey = strLine.Substring(p + 1, strLine.Length - p - 2);
                                      if (listKnownKeys.Contains(strKey)) {
                                          Console.WriteLine("Accepted key " + strKey);
                                          bAccept = true;
                                          listDest.Add(strLine);
                                      } else {
                                          Console.WriteLine("Invalid key " + strKey + " removed");
                                          bAccept = false;
                                          bNeedFix = true;
                                      }
                                  } else if (strLine.Trim() == "{") {
                                      if (bAccept) {
                                          listDest.Add(strLine);
                                      }
                                      iSection++;
                                  } else {
                                      listDest.Add(strLine);
                                  }
                                  break;
          
                              case 6:
                              case 7:
                              case 8:
                              case 9:
                                  if (strLine.Trim() == "{") {
                                      iSection++;
                                  } else if (strLine.Trim() == "}") {
                                      iSection--;
                                  }
                                  if (bAccept) {
                                      listDest.Add(strLine);
                                  }
                                  break;
          
                              case 10:
                                  throw new Exception("File structure depth exceeded!");
          
                              default:
                                  listDest.Add(strLine);
                                  break;
                          }
                      }
          
                      if (bNeedFix) {
                          File.Copy(args[0], args[0] + ".bak", true);
                          File.WriteAllLines(args[0], listDest);
                          Console.WriteLine("File " + args[0] + " has been fixed!");
                      } else {
                          Console.WriteLine("File " + args[0] + " did not need fix!");
                      }
          
                  } catch (Exception e) {
                      Console.WriteLine(e.ToString());
                  }
              }
          }
          

          【讨论】:

            【解决方案9】:

            重新启动 VS2010 对我不起作用,但我设法通过执行“清洁解决方案”和“构建解决方案”使一切正常。但是,在清理后尝试“重建解决方案”不起作用。然后我可以正常使用 F5 运行解决方案。

            【讨论】:

              【解决方案10】:

              我设法通过从解决方案中删除安装程序项目然后重新添加现有项目来解决此问题。

              【讨论】:

              • 也为我工作。谢谢。
              【解决方案11】:

              当您尝试调试并选择了发布模式时,也会发生这种情况。刚刚得到我:(

              【讨论】:

                【解决方案12】:

                当我收到此错误时,我发现我的 VS2010 部署项目 (.vdproj) 已“损坏”。具体来说,VDPROJ 文件的 FILE 部分中的项目具有 VDPROJ 文件的 HIERARCHY 部分中缺少的 GUID。这在下面详细描述。

                1) VS2010 部署项目包括以下几个部分:

                "Hierarchy"
                {
                }
                "Deployable"
                {
                    "File"
                    {
                    }
                } 
                

                2) HIERARCHY 部分包含添加到部署项目的每个项目(例如文件)的 GUID。此外,添加到项目中的每个文件都显示为 DEPLOYABLE > FILE 部分下的一个项目。以下示例显示文件 msimg32.dll 的正常配置。请注意 HIERARCHYFILE 部分中的匹配 GUID(即 _1C15DB39774F7E79C84F1CC87ECFD60A)。

                "Hierarchy"
                {
                  "Entry"
                    {
                    "MsmKey" = "8:_1C15DB39774F7E79C84F1CC87ECFD60A"
                    "OwnerKey" = "8:_0C67A6B6004040DC93A0113E1100615D"
                    "MsmSig" = "8:_UNDEFINED"
                    }
                  }
                "Deployable"
                {
                  "File"
                  {
                    "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1C15DB39774F7E79C84F1CC87ECFD60A"
                    {
                        "SourcePath" = "8:MSIMG32.dll"
                        "TargetName" = "8:MSIMG32.dll"
                        … more information ...
                    }
                  }
                }
                

                3) 我的 VS2010 部署项目可能会以两种方式损坏:

                • a) FILE 部分中的项目被复制,并且复制的项目被赋予了一个 GUID,该 GUID 没有出现在 HIERARCHY 部分中。

                • b) 与 FILE 部分中的项目关联的 GUID 已从 HIERARCHY 部分中删除(即 FILE 部分是孤立的)。

                3a) 第一个问题的示例 - FILE 部分中的重复项:

                在此示例中,文件 msimg32.dllFILE 部分中有两个条目。第一个(即正确)条目在 HIERARCHY 部分中具有匹配的 GUID(即 _1C15DB39774F7E79C84F1CC87ECFD60A),但第二个(即错误)条目(即 2DDC4FA12BFD46DEAED0053D23331348)的 GUID 未出现在 层次结构部分。

                "Hierarchy"
                {
                    "Entry"
                    {
                    "MsmKey" = "8:_1C15DB39774F7E79C84F1CC87ECFD60A"
                    "OwnerKey" = "8:_0C67A6B6004040DC93A0113E1100615D"
                    "MsmSig" = "8:_UNDEFINED"
                    }
                }
                "Deployable"
                {
                  "File"
                  {
                    "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1C15DB39774F7E79C84F1CC87ECFD60A"
                    {
                        "SourcePath" = "8:MSIMG32.dll"
                        "TargetName" = "8:MSIMG32.dll"
                        … more information ...
                    }
                    "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2DDC4FA12BFD46DEAED0053D23331348"
                    {
                        "SourcePath" = "8:MSIMG32.dll"
                        "TargetName" = "8:MSIMG32.dll"
                        … more information ...
                    }
                  }
                }
                

                3b) 第二个问题的示例 - FILE 部分中的孤立项:

                在此示例中,文件 msimg32.dllFILE 部分中有一个条目。但是与此条目关联的 GUID(即 A515046ADA6244F2A260E67625E4398F)在 HIERARCHY 部分中没有匹配的条目(即它缺失)。

                "Hierarchy"
                {
                }
                "Deployable"
                {
                  "File"
                  {
                    "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A515046ADA6244F2A260E67625E4398F"
                    {
                        "SourcePath" = "8:MSIMG32.dll"
                        "TargetName" = "8:MSIMG32.dll"
                        … more information ...
                    }
                  }
                }
                

                4) 解决方案:对于上述两个问题,解决方案是删除 FILE 部分中的孤立项。

                以下示例显示了上述第 3a 点中的 FILE 部分在 msimg32.dll 的第二个条目被删除后将如何显示。

                "Hierarchy"
                {
                    "Entry"
                    {
                    "MsmKey" = "8:_1C15DB39774F7E79C84F1CC87ECFD60A"
                    "OwnerKey" = "8:_0C67A6B6004040DC93A0113E1100615D"
                    "MsmSig" = "8:_UNDEFINED"
                    }
                }
                "Deployable"
                {
                  "File"
                  {
                    "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1C15DB39774F7E79C84F1CC87ECFD60A"
                    {
                        "SourcePath" = "8:MSIMG32.dll"
                        "TargetName" = "8:MSIMG32.dll"
                        … more information ...
                    }
                  }
                }
                

                5) 我发现 VDPROJ 中的损坏条目仅发生在:

                • a) 我的 C# 项目中的程序集文件(即 DLL)和
                • b) 从我的 C++ 项目中检测到依赖项(例如 version.dll、urlmon.dll)

                【讨论】:

                  【解决方案13】:

                  我想补充一点,当我从我的计算机而不是专用的编译器计算机编辑部署项目时,我得到了同样的错误。

                  上次我遇到该错误时,我需要回滚最后的更改,并从专用的编译器计算机重新执行。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2019-06-09
                    • 2023-03-31
                    • 1970-01-01
                    • 2022-01-16
                    • 2014-04-21
                    • 2017-07-29
                    • 2017-04-12
                    • 1970-01-01
                    相关资源
                    最近更新 更多