Tôi có một dự án thiết lập trong .NET. Khi tôi lưu dự án và các dự án khác để lật đổ, dự án thiết lập không còn biên dịch nữa. Tôi gặp lỗi "Không thể cập nhật các phụ thuộc của dự án."
Tôi có một dự án thiết lập trong .NET. Khi tôi lưu dự án và các dự án khác để lật đổ, dự án thiết lập không còn biên dịch nữa. Tôi gặp lỗi "Không thể cập nhật các phụ thuộc của dự án."
Câu trả lời:
Có một chủ đề thảo luận dài về điều này trên MSDN. Có vẻ như có nhiều nguyên nhân có thể xảy ra. Cuộc thảo luận bao gồm một số liên kết cho vấn đề này từ Microsoft. Đây là một hotfix cho VS2005 và đây là một giải pháp cho VS2010.
Đóng VS2010 và sau đó mở lại nó luôn hoạt động với tôi :)
Tôi đã gặp vấn đề tương tự, nhưng không có giải pháp nào được đề cập có vẻ phù hợp với tôi. Việc xây dựng lại dự án thiết lập sẽ hiệu quả, nhưng đó là một điều khó khăn, vì chúng tôi bao gồm đầu ra của dự án của hơn 30 dự án.
Điều tôi thấy có hiệu quả là một cách tiếp cận rất giống với những gì @Marc đã làm.
Trong mọi trường hợp, tôi có nhiều tham chiếu đến cùng một dll (không chắc điều này đã xảy ra như thế nào)
Ví dụ về tham chiếu đúng:
"{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:"
}
Ví dụ về tham chiếu không chính xác:
"{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:"
}
Tôi cũng nhận được cảnh báo tương tự "Hai hoặc nhiều đối tượng có cùng vị trí đích ('[targetdir] \ MyAssembly.dll')" rằng @Marc đã nhận ... nhưng dự án thiết lập biên dịch và chạy tốt.
File
tham chiếu lắp ráp. Hoạt động hoàn hảo.
Liên kết chính xác để sửa lỗi nóng cho VS2010 là:
http://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=30681
Hoạt động tốt sau khi cài đặt
Tôi đã gặp sự cố tương tự và đã tìm thấy cách khắc phục trong cuộc thảo luận rất dài và cũ này trên MSDN .
Như người dùng 'Jeff Hunsaker' vào thứ Năm, ngày 26 tháng 8 năm 2010 đã trả lời 5:51 CH (không thể liên kết trực tiếp):
Tôi vừa gặp phải vấn đề này khi nâng cấp Visual Studio 2008 Deployment Projects lên VS 2010. Giải pháp của Hans (ở trên) phù hợp với tôi.
- Chỉnh sửa tệp .vdproj trong Notepad.
- Tìm kiếm "SourcePath" = "8:
- Đối với mỗi assembly / dll, hãy cung cấp đường dẫn đầy đủ
- Lưu tập tin
Trong tệp .vdproj của mình, tôi có một số mục nhập chỉ đơn giản là tham chiếu đến assembly:
"SourcePath" = "8: MyAssembly.DLL"Mặc dù Visual Studio [bằng cách nào đó] biết vị trí tệp, tôi vẫn nhận được lỗi "Không thể cập nhật các phần phụ thuộc của dự án" cho đến khi tôi cung cấp đường dẫn đầy đủ:
"SourcePath" = "8: .. \ .. \ .. \ build \ bin \ MyCompany.MyAssembly.DLL"
Trân trọng,
Jeff ...
Tôi đã lưu ý những phụ thuộc nào đã được Visual Studio báo cáo và viết một tập lệnh để sửa chúng trong trường hợp điều này là bắt buộc.
Lưu ý rằng điều này hiện đưa ra cho tôi một cảnh báo "Hai hoặc nhiều đối tượng có cùng vị trí đích ('[targetdir] \ MyAssembly.dll'). Nhưng tôi có thể sống với điều đó.
Điều này đã giải quyết được cùng một vấn đề đối với tôi: Tôi đã thêm các hội đồng được đề cập trong thông báo lỗi vào GAC. Khi tôi biên dịch lại dự án, dll xuất hiện trong "Sự phụ thuộc được phát hiện" trong Trình khám phá giải pháp và tôi gặp lỗi tương tự. Sau đó, tôi đã loại trừ dll (nhấp chuột phải và chọn Loại trừ) và cuối cùng dự án được biên dịch ok.
Sự cố có thể do tệp mồ côi trong phần "Có thể triển khai" -> "Tệp" của tệp .vdproj gây ra. Bạn có thể xác minh điều này bằng cách xóa tất cả các tệp khỏi dự án thiết lập trong Visual Studio (tạo bản sao lưu trước). Nếu bạn mở tệp .vdproj bằng trình soạn thảo văn bản và vẫn thấy các mục nhập trong phần "Tệp" thì bạn gặp sự cố này. Bạn có thể ghi lại khóa của các tệp này và xóa chúng khỏi tệp .vdproj ban đầu và nó sẽ hoạt động trở lại.
Ngoài ra, biên dịch chương trình sửa lỗi nhanh này (chỉ được thử nghiệm với 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());
}
}
}
Khởi động lại VS2010 không hiệu quả với tôi nhưng tôi đã quản lý để mọi thứ hoạt động bằng cách thực hiện 'Giải pháp sạch', sau đó là 'Giải pháp xây dựng'. Tuy nhiên, thử 'Giải pháp xây dựng lại' sau khi dọn dẹp không hoạt động. Sau đó, tôi có thể chạy Giải pháp với F5 như bình thường.
Khi tôi gặp lỗi này, tôi thấy dự án triển khai VS2010 (.vdproj) của mình bị 'hỏng'. Cụ thể, các mục trong phần FILE của tệp VDPROJ có GUID bị thiếu trong phần HIERARCHY của tệp VDPROJ. Điều này được mô tả chi tiết dưới đây.
1) Các dự án triển khai VS2010 bao gồm các phần sau:
"Hierarchy"
{
}
"Deployable"
{
"File"
{
}
}
2) Phần HIERARCHY chứa các HƯỚNG DẪN cho từng mục (ví dụ: tệp) được thêm vào dự án triển khai. Ngoài ra, mỗi tệp được thêm vào dự án sẽ xuất hiện dưới dạng một mục trong phần CÓ THỂ GỬI> TỆP . Ví dụ sau đây cho thấy một cấu hình bình thường cho tệp msimg32.dll . Lưu ý GUID phù hợp (tức là _1C15DB39774F7E79C84F1CC87ECFD60A) trong phần HIERARCHY và 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) Các dự án triển khai VS2010 của tôi có thể bị hỏng theo hai cách:
a) Một mục trong phần FILE được sao chép và mục được sao chép được cung cấp một HƯỚNG DẪN không xuất hiện trong phần HIERARCHY .
b) GUID được liên kết với một mục trong phần FILE đã bị xóa khỏi phần HIERARCHY (tức là mục trong phần FILE không có).
3a) Ví dụ về vấn đề đầu tiên - mục trùng lặp trong phần FILE :
Trong ví dụ này, tệp msimg32.dll có hai mục nhập trong phần FILE . Mục đầu tiên (tức là đúng) có GUID phù hợp (tức là _1C15DB39774F7E79C84F1CC87ECFD60A) trong phần HIERARCHY , nhưng GUID cho mục thứ hai (tức là lỗi) (tức là 2DDC4FA12BFD46DEAED0053D23331348) không xuất hiện trong phần 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) Ví dụ về vấn đề thứ hai - mục mồ côi trong phần FILE :
Trong ví dụ này, tệp msimg32.dll có một mục nhập trong phần FILE . Nhưng GUID được liên kết với mục nhập này (tức là A515046ADA6244F2A260E67625E4398F) không có mục nhập phù hợp trong (tức là nó bị thiếu trong) phần HIERARCHY .
"Hierarchy"
{
}
"Deployable"
{
"File"
{
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A515046ADA6244F2A260E67625E4398F"
{
"SourcePath" = "8:MSIMG32.dll"
"TargetName" = "8:MSIMG32.dll"
… more information ...
}
}
}
4) Giải pháp: Đối với cả hai vấn đề được minh họa ở trên, giải pháp là xóa mục mồ côi trong phần FILE .
Ví dụ sau đây cho thấy cách phần FILE trong điểm 3a ở trên sẽ xuất hiện sau khi mục nhập thứ hai cho msimg32.dll đã bị xóa.
"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) Tôi thấy các mục nhập bị hỏng trong VDPROJ chỉ xảy ra cho:
Dưới đây là một số giải pháp hoạt động:
1) Xóa một trong các tệp DLL có vấn đề khỏi dự án thiết lập, sau đó chỉ thêm lại tệp đó đã giải quyết được sự cố cho tôi. Điều này hoạt động ngay cả khi có nhiều tệp DLL gặp sự cố. Chỉ xóa và thêm một trong số chúng đã kích hoạt VS2010 để sửa chữa tất cả bằng cách nào đó.
2) Xây dựng lại giải pháp, sau đó thử cập nhật lại các phần phụ thuộc. Việc xây dựng lại giúp studio trực quan phát hiện ra những phụ thuộc là gì, bởi vì nó có thể đang vật lộn để tìm ra những phụ thuộc mà không có gì được xây dựng.
3) Khởi động lại Visual Studio
Hotfix VS2010 được liên kết ở trên không hoạt động với tôi. Đôi khi khởi động lại VS2010 sẽ khắc phục được sự cố và khi điều đó không hoạt động, thực hiện các bước trên sẽ hoạt động.