«Невозможно обновить зависимости проекта» после фиксации в Subversion - PullRequest
89 голосов
/ 13 июля 2010

У меня есть проект установки в .NET. Когда я сохраняю проект и другие проекты в Subversion, проект установки больше не компилируется. Я получаю сообщение об ошибке «Невозможно обновить зависимости проекта».

Ответы [ 13 ]

94 голосов
/ 07 сентября 2012

Закрытие VS2010 и его повторное открытие всегда работало для меня:)

49 голосов
/ 13 июля 2010

На MSDN существует длинная дискуссия .Кажется, что есть много возможных причин.Обсуждение включает в себя несколько ссылок на эту проблему от Microsoft. Вот исправление для VS2005 и здесь есть обходной путь для VS2010.

30 голосов
/ 30 марта 2012

У меня была такая же проблема, но ни одна из упомянутых резолюций, казалось, не работала для меня.Перестройка проекта установки сработает, но это неприятно, поскольку мы включаем результаты проектов более 30 проектов.

То, что я нашел для работы, очень похоже на то, что делал @Marc.

  1. Я заметил, какие зависимости были сообщены Visual Studio как ошибки
  2. Отредактируйте файл .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:"
}

Я тоже получил "Два или болееобъекты имеют одно и то же целевое местоположение ('[targettdir] \ MyAssembly.dll') ", предупреждающее, что @Marc получил ... но проект установки компилируется и работает нормально.

10 голосов
/ 16 августа 2012

Правильная ссылка для оперативного исправления для VS2010:

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

Работает нормально после установки

6 голосов
/ 07 сентября 2011

У меня была похожая проблема, и я нашел исправление в этом очень долгом и старом обсуждении MSDN .
Как пользователь 'Jeff Hunsaker' в четверг, 26 августа 2010 г., 17:51 ответил (прямая ссылка невозможна):

Я только что столкнулся с этим при обновлении проектов развертывания Visual Studio 2008 до VS 2010. Решение Ханса (выше) мне помогло.

  1. Редактировать файл .vdproj в Блокноте.
  2. Поиск "SourcePath" = "8:
  3. Для каждой сборки / dll укажите полный путь
  4. Сохранить файл

В моем файле .vdproj у меня было несколько записей, просто ссылающихся на сборку:
"SourcePath" = "8: MyAssembly.DLL"

Несмотря на то, что Visual Studio [каким-то образом] знал местоположение файла, я получал ошибку «Невозможно обновить зависимости проекта», пока не указал полный путь:

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

С уважением,

Джеф ...

Я заметил, о каких зависимостях сообщила Visual Studio, и написал скрипт для их устранения в случае необходимости.

Обратите внимание, что теперь это дает мне предупреждение: «Два или более объекта имеют одно и то же целевое местоположение ('[targettdir] \ MyAssembly.dll'). Но я могу жить с этим.

4 голосов
/ 01 ноября 2012

Это решило ту же проблему для меня: я добавил сборки, которые были упомянуты в сообщении об ошибке, в GAC.Когда я перекомпилировал проект, dll появились в разделе «Обнаруженные зависимости» в обозревателе решений, и я получил ту же ошибку.Затем я исключил DLL (щелкните правой кнопкой мыши и выберите «Исключить»), и проект, наконец, скомпилирован нормально.

3 голосов
/ 26 июня 2013

Мне удалось обойти эту проблему, удалив проект установки из решения, а затем снова добавив существующий проект.

3 голосов
/ 04 апреля 2013

Проблема может быть вызвана потерянными файлами в разделе «Deployable» -> «File» файла .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());
        }
    }
}
1 голос
/ 31 октября 2013

Когда я получаю эту ошибку, я обнаружил, что мой проект развертывания VS2010 (.vdproj) «поврежден».В частности, элементы в разделе FILE файла VDPROJ имеют идентификаторы GUID, отсутствующие в разделе HIERARCHY файла VDPROJ.Это подробно описано ниже.

1) Проекты развертывания VS2010 включают в себя следующие разделы:

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

2) Раздел HIERARCHY содержит GUID для каждого элемента (например, файла), добавленного в проект развертывания,Кроме того, каждый файл, добавленный в проект, отображается как элемент в разделе DEPLOYABLE> FILE .В следующем примере показана нормальная конфигурация для файла msimg32.dll .Обратите внимание на совпадающий GUID (т. Е. _1C15DB39774F7E79C84F1CC87ECFD60A) в разделах HIERARCHY и 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 ...
    }
  }
}

3) Мои проекты развертывания VS2010 могут быть повреждены двумя способами:

  • a) Элемент в разделе FILE дублировани дублированному элементу присваивается GUID, который отсутствует в разделе HIERARCHY .

  • b) GUID, связанный с элементом в FILE *Раздел 1036 * был удален из раздела HIERARCHY (то есть элемент в разделе FILE потерян).

3a) ПримерПервая проблема - дублированный элемент в разделе FILE :

В этом примере файл msimg32.dll содержит две записи в разделе FILE .Первая (т. Е. Правильная) запись имеет соответствующий GUID (т. Е. _1C15DB39774F7E79C84F1CC87ECFD60A) в разделе HIERARCHY , но GUID для второй (т. Е. Ошибки) записи (т. Е. 2DDC4FA12BFD46DEAED0053D23331348AR) HY не отображается в HIN, который не отображается в HIN HAR section.

"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.dll имеет запись в разделе FILE .Но GUID, связанный с этой записью (т. Е. A515046ADA6244F2A260E67625E4398F), не имеет соответствующей записи в (т. Е. Отсутствует в) разделе HIERARCHY .

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

4) Решение: для обоихпроблемы, показанные выше, решение состоит в том, чтобы удалить потерянный элемент в разделе FILE .

В следующем примере показано, как будет выглядеть раздел FILE в пункте 3а выше после удаления второй записи для 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) файлов сборок (т.е. DLL) из моих проектов на C # и
  • b) обнаруженных зависимостей отмои C ++ проекты (например, version.dll, urlmon.dll)
1 голос
/ 29 апреля 2013

Перезапуск VS2010 у меня не сработал, но мне удалось заставить все работать, применив «Чистое решение», а затем «Построение решения». Попытка «Восстановить решение» после очистки не сработала. Тогда я мог бы запустить Решение с F5 как обычно.

...