提交Subversion后“无法更新项目的依赖项”

时间:2010-07-12 23:47:14

标签: winforms deployment dependencies setup-project

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

13 个答案:

答案 0 :(得分:94)

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

答案 1 :(得分:49)

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

答案 2 :(得分:30)

我遇到了同样的问题,但所提到的决议似乎都不适合我。重建设置项目会起作用,但这很痛苦,因为我们包含30多个项目的项目输出。

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

  1. 我注意到Visual Studio将哪些依赖项报告为错误
  2. 在Notepad ++中编辑.vdproj文件
  3. 搜索提出问题的.dll。您将看到“ScatterAssemblies”部分。如果为空,则删除整个dll参考
  4. 保存文件
  5. 在所有情况下,我都有多个引用相同的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得到...但安装项目编译并运行正常。

答案 3 :(得分:10)

VS2010热修复的正确链接是:

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

安装后工作正常

答案 4 :(得分:6)

答案 5 :(得分:4)

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

答案 6 :(得分:3)

问题可能是由于" Deployable"中的孤立文件引起的。 - > "文件" .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());
        }
    }
}

答案 7 :(得分:3)

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

答案 8 :(得分:1)

重新启动VS2010对我来说不起作用,但我设法通过执行“清洁解决方案”,然后是“构建解决方案”来完成所有工作。但是,在清洁后尝试“重建解决方案”不起作用。然后我可以像往常一样用F5运行解决方案。

答案 9 :(得分:1)

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

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

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

2) HIERARCHY 部分包含添加到部署项目的每个项目(例如文件)的GUID。此外,添加到项目中的每个文件都显示为 DEPLOYABLE&gt;下的项目。文件部分。以下示例显示了文件 msimg32.dll 的正常配置。请注意 HIERARCHY FILE 部分中匹配的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不会出现在 HIERARCHY 部分中。

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

3a)第一个问题的例子 - 文件部分中的重复项目:

在此示例中,文件 msimg32.dll 文件部分中有两个条目。第一(即正确的)条目具有在层次部分匹配的GUID(即_1C15DB39774F7E79C84F1CC87ECFD60A),但GUID用于第二(即误差)条目(即2DDC4FA12BFD46DEAED0053D23331348)不出现在 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)第二个问题的示例 - 文件部分中的孤立项:

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

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

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

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

"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)

答案 10 :(得分:0)

以下是一些有效的解决方案:

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

2)重建解决方案,然后再次尝试更新依赖项。重建有助于视觉工作室发现依赖关系是什么,因为它可能很难找到没有构建的依赖项。

3)重新启动Visual Studio

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

上次出现该错误时,我需要回滚最后一次更改,然后从专用编译器计算机重新执行此操作。