提交到Subversion后,“无法更新项目的依赖关系”

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

在MSDN上有一个关于这个问题的长篇讨论 。 似乎有很多可能的原因。 讨论包括微软针对这个问题的一些链接。 这里是 VS2005 的修补程序 , 这里是 VS2010 的解决方法 。

closuresVS2010,然后重新打开它一直为我工作:)

我有同样的问题,但没有提到的决议似乎为我工作。 重build安装项目是可行的,但这是一个痛苦,因为我们包含了30多个项目的项目输出。

我发现的工作与@Marc的做法非常类似。

  1. 我注意到Visual Studio报告哪些依赖项为错误
  2. 在Notepad ++中编辑.vdproj文件
  3. search提供问题的.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:" } 

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

正确的链接为VS2010热修复是:

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

安装后工作正常

我遇到了类似的问题,并在MSDN的这个很长时间的讨论中find了一个解决办法。
作为用户Jeff Hunsaker在2010年8月26日星期四下午5:51回答(直接链接不可能):

当Visual Studio 2008部署项目升级到VS 2010时,我刚刚遇到了这个问题。Hans的(上面)解决scheme为我工作。

  1. 在记事本中编辑.vdproj文件。
  2. search“SourcePath”=“8:
  3. 对于每个程序集/ DLL,提供完整的path
  4. 保存存档

在我的.vdproj文件中,我有几个简单的引用程序集的条目:
“SourcePath”=“8:MyAssembly.DLL”

即使Visual Studio [知道]知道文件位置,我收到“无法更新项目的依赖项”错误,直到我提供完整的path:

“SourcePath”=“8:.. \ .. \ .. \ build \ bin \ MyCompany.MyAssembly.DLL”

问候,

杰夫…

我注意到Visual Studio报告了哪些依赖关系,并编写了一个脚本来解决这些问题,以防需要这样做。

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

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

该问题可能是由.vdproj文件的“Deployable” – >“File”部分中的孤立文件造成的。 您可以通过从Visual Studio中的安装项目中删除所有文件(首先进行备份)来validation这一点。 如果使用文本编辑器打开.vdproj文件,仍然可以看到“文件”部分中的条目,则说明存在此问题。 您可以记下这些文件的密钥,并将其从原始.vdproj文件中删除,并且应该再次运行。

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

 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()); } } } 

我设法通过从解决scheme中删除安装程序项目,然后再次添加现有项目来解决此问题。

重新启动VS2010并不适合我,但我设法通过执行“清理解决scheme”,然后是“构build解决scheme”来使所有工作都能正常进行。 然而,在清洁之后尝试“重build解决scheme”却不行。 然后我可以正常运行与F5的解决scheme。

当我得到这个错误,我发现我的VS2010部署项目(.vdproj)是'损坏'。 特别是,VDPROJ文件的FILE部分中的项目具有从VDPROJ文件的HIERARCHY部分中缺less的GUID。 这在下面详细描述。

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

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

2) HIERARCHY部分包含添加到部署项目中的每个项目(例如文件)的GUID。 另外,添加到项目中的每个文件都显示为DEPLOYABLE> FILE部分下的项目。 以下示例显示了msimg32.dll文件的正常configuration。 请注意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部分。

 "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)解决scheme:对于上述两个问题,解决方法是删除FILE部分中的孤立项。

以下示例显示了如何删除msimg32.dll的第二个条目之后出现上面的第3a点中的FILE部分。

 "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)中检测到依赖关系

这里有几个解决scheme可以工作:

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

2)重build解决scheme,然后再次尝试更新依赖关系。 重build帮助visual studio发现依赖关系,因为它可能正在努力寻找没有构build的依赖关系。

3)重新启动Visual Studio

上面链接的VS2010修补程序不适合我。 有时重新启动VS2010将解决这个问题,当这不起作用,做上述工作。

当您尝试debugging并select了发行模式时,也会发生这种情况。 让我只是现在:(

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

上一次我得到这个错误,我需要回滚最后的变化,并重新从专用的编译器计算机。