Ho un progetto di installazione in .NET. Quando salvo il progetto e gli altri progetti in subversion, il progetto di installazione non viene più compilato. Ricevo l'errore "Impossibile aggiornare le dipendenze del progetto".
Ho un progetto di installazione in .NET. Quando salvo il progetto e gli altri progetti in subversion, il progetto di installazione non viene più compilato. Ricevo l'errore "Impossibile aggiornare le dipendenze del progetto".
Risposte:
C'è una lunga discussione thread su questo su MSDN. Sembra che ci siano molte possibili cause. La discussione include alcuni collegamenti per questo problema da Microsoft. Ecco un hotfix per VS2005 e una soluzione alternativa per VS2010.
Chiudere VS2010 e poi riaprirlo ha sempre funzionato per me :)
Ho avuto lo stesso problema, ma nessuna delle risoluzioni menzionate sembrava funzionare per me. La ricostruzione del progetto di installazione funzionerebbe, ma è un problema, poiché includiamo i risultati del progetto di oltre 30 progetti.
La cosa che ho scoperto funzionare è un approccio molto simile a quello che ha fatto @Marc.
In tutti i casi ho avuto più riferimenti alla stessa dll (non sono sicuro di come sia successo)
Esempio di riferimento corretto:
"{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:"
}
Esempio di riferimento errato:
"{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:"
}
Ho anche ricevuto lo stesso messaggio "Due o più oggetti hanno la stessa posizione di destinazione ('[targetdir] \ MyAssembly.dll')" avvertendo che @Marc ha ottenuto ... ma il progetto di installazione viene compilato e funziona correttamente.
File
riferimenti all'assembly. Ha funzionato perfettamente.
Il collegamento corretto per la correzione rapida per VS2010 è:
http://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=30681
Funziona bene dopo l'installazione
Ho avuto il problema simile e ho trovato una soluzione in questa lunga e vecchia discussione su MSDN .
Come ha risposto l'utente "Jeff Hunsaker" giovedì 26 agosto 2010 17:51 (collegamento diretto non possibile):
Ho riscontrato questo problema durante l'aggiornamento dei progetti di distribuzione di Visual Studio 2008 a VS 2010. La soluzione di Hans (sopra) ha funzionato per me.
- Modifica il file .vdproj in Blocco note.
- Cerca "SourcePath" = "8:
- Per ogni assembly / dll, fornire il percorso completo
- Salvare il file
Nel mio file .vdproj, avevo diverse voci che facevano semplicemente riferimento all'assembly:
"SourcePath" = "8: MyAssembly.DLL"Anche se Visual Studio [in qualche modo] conosceva il percorso del file, ho ricevuto l'errore "Impossibile aggiornare le dipendenze del progetto" finché non ho fornito il percorso completo:
"SourcePath" = "8: .. \ .. \ .. \ build \ bin \ MyCompany.MyAssembly.DLL"
Saluti,
Jeff ...
Ho notato quali dipendenze sono state segnalate da Visual Studio e ho scritto uno script per risolverle nel caso in cui fosse necessario.
Nota che questo ora mi dà un avviso "Due o più oggetti hanno la stessa posizione di destinazione ('[targetdir] \ MyAssembly.dll'). Ma posso conviverci.
Questo ha risolto lo stesso problema per me: ho aggiunto gli assembly menzionati nel messaggio di errore al GAC. Quando ho ricompilato il progetto, le DLL sono apparse in "Dipendenze rilevate" in Esplora soluzioni e ho ricevuto lo stesso errore. Quindi ho escluso le dll (fare clic con il tasto destro e selezionare Escludi) e il progetto finalmente è stato compilato correttamente.
Il problema potrebbe essere causato da file orfani nella sezione "Deployable" -> "File" del file .vdproj. Puoi verificarlo rimuovendo tutti i file dal progetto di installazione in Visual Studio (esegui prima un backup). Se apri il file .vdproj con un editor di testo e vedi ancora le voci nella sezione "File", hai questo problema. Puoi annotare le chiavi di questi file e rimuoverle dal file .vdproj originale e dovrebbe funzionare di nuovo.
In alternativa, compila questo programma di correzione rapida (testato solo con 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());
}
}
}
Il riavvio di VS2010 non ha funzionato per me, ma sono riuscito a far funzionare tutto eseguendo una "soluzione pulita", quindi una "soluzione build". Tuttavia, provare "Ricostruisci soluzione" dopo la pulizia non ha funzionato. Quindi potrei eseguire la soluzione con F5 normalmente.
Quando ricevo questo errore, trovo che il mio progetto di distribuzione VS2010 (.vdproj) è "danneggiato". In particolare, gli elementi nella FILE sezione del file VDPROJ hanno di GUID che mancano dalla GERARCHIA sezione del file VDPROJ. Questo è descritto in dettaglio di seguito.
1) I progetti di distribuzione di VS2010 includono le seguenti sezioni:
"Hierarchy"
{
}
"Deployable"
{
"File"
{
}
}
2) La sezione GERARCHIA contiene GUID per ogni elemento (es. File) aggiunto al progetto di distribuzione. Inoltre, ogni file aggiunto al progetto appare come un elemento nella sezione DISPONIBILE> FILE . L'esempio seguente mostra una configurazione normale per il file msimg32.dll . Notare il GUID corrispondente (ad esempio _1C15DB39774F7E79C84F1CC87ECFD60A) nelle sezioni GERARCHIA e 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) I miei progetti di distribuzione VS2010 possono essere danneggiati in due modi:
a) Un elemento nella sezione FILE viene duplicato e l'elemento duplicato riceve un GUID che non compare nella sezione GERARCHIA .
b) Il GUID associato a un elemento nella sezione FILE è stato rimosso dalla sezione GERARCHIA (ovvero l'elemento nella sezione FILE è orfano).
3a) Esempio del primo problema - elemento duplicato nella sezione FILE :
In questo esempio, il file msimg32.dll ha due voci nella sezione FILE . La prima voce (es. Corretta) ha un GUID corrispondente (es. _1C15DB39774F7E79C84F1CC87ECFD60A) nella sezione GERARCHIA , ma il GUID per la seconda voce (es. Errore) (es. 2DDC4FA12BFD46DEAED0053D23331348) non appare nella sezione GERARCHIA .
"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) Esempio del secondo problema - elemento orfano nella sezione FILE :
In questo esempio, il file msimg32.dll ha una voce nella sezione FILE . Ma il GUID associato a questa voce (ad esempio A515046ADA6244F2A260E67625E4398F) non ha una voce corrispondente nella sezione GERARCHIA (cioè manca) .
"Hierarchy"
{
}
"Deployable"
{
"File"
{
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A515046ADA6244F2A260E67625E4398F"
{
"SourcePath" = "8:MSIMG32.dll"
"TargetName" = "8:MSIMG32.dll"
… more information ...
}
}
}
4) Soluzione: per entrambi i problemi illustrati sopra, la soluzione è eliminare l'elemento orfano nella sezione FILE .
Il seguente esempio mostra come apparirà la sezione FILE nel punto 3a sopra dopo che la seconda voce per msimg32.dll è stata eliminata.
"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) Ho trovato che le voci danneggiate nel VDPROJ si verificano solo per:
Ecco un paio di soluzioni che funzionano:
1) La rimozione di una delle DLL problematiche dal progetto di installazione e quindi l'aggiunta di solo quella ha risolto il problema per me. Ciò ha funzionato anche quando c'erano molte DLL con il problema. La rimozione e l'aggiunta di uno solo di essi ha attivato VS2010 per risolverli tutti in qualche modo.
2) Ricostruisci la soluzione, quindi prova ad aggiornare nuovamente le dipendenze. La ricostruzione aiuta Visual Studio a scoprire quali sono le dipendenze, perché potrebbe essere difficile trovare le dipendenze senza che sia stato creato nulla.
3) Riavvia Visual Studio
L'hotfix VS2010 collegato sopra non ha funzionato per me. A volte il riavvio di VS2010 risolverà il problema e quando ciò non funziona, eseguendo i lavori sopra.
Vorrei aggiungere che ottengo lo stesso errore quando modifico il progetto di distribuzione dal mio computer anziché dal computer del compilatore dedicato.
L'ultima volta che ho ricevuto quell'errore avevo bisogno di ripristinare le ultime modifiche e rifarlo dal computer del compilatore dedicato.