2011-07-22 14 views
17

ClickOnce chỉ xem tệp kê khai ứng dụng để xác định tệp dll nào sẽ sao chép vào máy của khách hàng hay nó cũng thẩm vấn nội bộ của một hội đồng để xác định tệp phụ thuộc?ClickOnce - File đã tồn tại lỗi - Tại sao một tập tin DLL cố gắng để được sao chép hai lần bởi ClickOnce?

Lý do tôi hỏi là vì tôi nhận được lỗi ClickOnce dưới đây khi cố gắng khởi chạy ứng dụng WPF .NET 4 đã được xuất bản với ClickOnce: Tệp C:\Users\CNelson\AppData\Local\Temp\Deployment\PGX6P33A.35N\AJQL8AC8.D60\tx16_rtf.dll đã tồn tại.

Lỗi này bắt đầu sau khi tôi đã bao gồm tham chiếu đến hai tệp DLL bên thứ ba. Cả hai đều tham chiếu đến tệp dll không được quản lý (tx16_rtf.dll). Tôi muốn tx16_rtf.dll được sao chép vào thư mục bin trên máy tính của khách hàng vì vậy tôi đã đưa nó vào dự án của tôi và đặt Hành động Xây dựng thành ‘Nội dung’ và Thư mục Sao chép sang Đầu ra thành ‘Sao chép Luôn’.

Tuy nhiên, vì một số lý do khi tôi cố gắng khởi chạy ứng dụng, ClickOnce đang cố sao chép tệp ‘tx16_rtf.dll’ hai lần, dẫn đến lỗi.

Nếu tôi xem tệp kê khai triển khai, tôi có thể thấy rõ ràng một và chỉ một mục nhập cho tệp ‘tx16_rtf.dll’. Vì vậy, câu hỏi của tôi là, tại sao ClickOnce cố gắng sao chép tệp 'tx16_rtf.dll' hai lần nếu nó chỉ tồn tại một lần trong tệp kê khai triển khai?

Dưới đây là một đoạn của việc triển khai file manifest rằng tài liệu tham khảo ‘tx16_rtf.dll’:

<file name="tx16_rtf.dll" size="839680"> 
    <hash> 
     <dsig:Transforms> 
     <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> 
     </dsig:Transforms> 
     <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
     <dsig:DigestValue>V6i2QcARl3+1SJHCugoazb9zrOY=</dsig:DigestValue> 
    </hash> 
    </file> 
+0

giải pháp của bạn cho vấn đề này là gì? –

+0

Giải pháp của tôi là không tham khảo các dll không được quản lý trong dự án của tôi. Do đó, ClickOnce sẽ không bao gồm chúng trong tệp kê khai. Thay vào đó, những gì tôi đã làm là bao gồm các tệp dll không được quản lý trong một tệp nén (thiết lập Build Action thành 'Content') và khi ứng dụng của tôi khởi động nó sẽ giải nén các tập tin không được quản lý vào thư mục thực hiện dòng lệnh ... và mọi thứ hoạt động như quyến rũ. – ChrisNel52

Trả lời

10

Trong giải pháp Visual Studio của bạn, làm thế nào được các tập tin bổ sung? Hãy thử như sau.

Thêm dll vào dự án của bạn.

Nếu bạn có tham chiếu đến dll trong Tham khảo, hãy đặt thuộc tính trên dll như sau: Build Action = none, Sao chép vào thư mục đầu ra = "không sao chép". Sau đó xóa tham chiếu và sau đó thêm lại tham chiếu, nhưng trỏ đến dll đó trong thư mục dự án cục bộ của bạn. Trên REference, đặt "copy local" thành true.

Nếu bạn không có Tài liệu tham khảo cho dll, hãy đặt thuộc tính trên dll như sau: Build Action = "copy". Sao chép vào thư mục đầu ra = "Sao chép luôn luôn".

Nếu bạn có tham chiếu, bạn muốn lý do đưa vào dựa trên tham chiếu chứ không phải trên thuộc tính dll. Nếu bạn không có tham chiếu, bạn muốn đặt dll cụ thể để được bao gồm.

Cũng kiểm tra hộp thoại Tệp ứng dụng và đảm bảo dll không được đánh dấu là Bao gồm (Điều kiện tiên quyết), nhưng là Bao gồm hoặc Bao gồm (Bắt buộc).

+1

Tôi tự động tạo tệp kê khai bằng mage.exe. Tôi cảm thấy tôi có hiểu biết tổng thể về các tệp ClickOnce và tệp kê khai, nhưng có một điều gì đó bí mật mà ClickOnce đang làm với các tệp dll không được quản lý. Tuy nhiên, cố gắng tìm tài liệu chi tiết về các hoạt động bên trong của ClickOnce dường như là không thể. – ChrisNel52

+0

RobinDotNet giải thích của bạn đã dẫn tôi đến một câu trả lời cho vấn đề clickll dll trùng lặp của tôi vì vậy tôi upvoted bạn. – TWood

+13

Xin lỗi để tham gia bữa tiệc muộn, nhưng vì lợi ích của người tìm kiếm, tôi đã có một vấn đề tương tự với Automapper.Net4.dll. Vấn đề là tôi đã tham khảo cả hai 'Automapper.Net4.dll' và 'Automapper.dll', (mà sau này tôi tìm thấy đã tham khảo chính Net4.dll). Theo lời khuyên trên. Loại bỏ tham chiếu ClickOnce Khiếu nại về, xóa thư mục bin và xây dựng lại dự án. Các dll 4 net kỳ diệu tái xuất hiện, do đó, các tài liệu tham khảo trực tiếp là không cần thiết. Không có probs với ClickOnce sau đó. – HockeyJ

8

Bạn không đề cập đến nếu bạn đang sử dụng tuyệt vời (ho) MAGE.EXE để tạo tệp kê khai triển khai của bạn. Tuy nhiên tôi đã gặp phải cùng một 'File x đã tồn tại' lỗi, và nó được gây ra bởi hội đồng quản lý có chức năng gọi trong hội đồng bản địa thông qua P/Invoke.

Đối với mỗi hội đồng được quản lý tại vị trí được chỉ định bởi đối số -FromDirectory đến MAGE.EXE, MAGE sẽ tạo một tập hợp các phần tử (bao gồm mã định danh, kích thước, băm, v.v.). Đối với mỗi tệp khác (bao gồm cả các tập hợp gốc không được quản lý) MAGE.EXE sẽ tạo một phần tử <file>...</file>.

Tuy nhiên lúc cài đặt, có vẻ như ClickOnce thực sự kiểm tra siêu dữ liệu tệp kê khai của từng hội đồng được quản lý.Vì vậy, nếu ứng dụng của bạn có ManagedAssemblyA mà P/Invokes mã trong NativeAssemblyB (hoặc tx16_rtf.dll trong trường hợp của bạn), bạn sẽ thấy thông qua ILDASM rằng tệp kê khai cho ManagedAssemblyA có tuyên bố .module extern NativeAssemblyB.dll.

Tôi chỉ có thể giả định rằng ClickOnce, trong khi xử lý phần tử <dependentAssembly codebase="ManagedAssemblyA.dll">, kiểm tra siêu dữ liệu của hội đồng, thấy rằng có một phiên bản gốc được tham chiếu, thấy rằng nó cũng nằm trong cùng một vị trí triển khai và sao chép nó xuống. Sau đó, khi xử lý sau yếu tố <file name="NativeAssemblyB.dll">, lỗi này đã xảy ra khi nó đã sao chép tệp này và giả định không cài đặt là hành động an toàn nhất. Tôi đã không tìm thấy hành vi này được tài liệu của Microsoft ở bất cứ đâu.

Vì vậy, giải pháp là, sau khi tạo tệp kê khai triển khai với MAGE.EXE, nhưng trước khi ký, hãy xóa các phần tử <file> cho bất kỳ cụm gốc nào. Các hội đồng bản địa vẫn cần phải có sẵn trong cùng một vị trí triển khai như phần còn lại của các hội đồng theo yêu cầu của ứng dụng ClickOnce.

Trong trường hợp của chúng tôi, chúng tôi tự động hóa việc này vì chúng tôi cũng tự động hóa việc tạo tệp kê khai triển khai với mỗi bản dựng tích hợp liên tục (trái ngược với việc sử dụng Trình hướng dẫn xuất bản bên trong Visual Studio 2010 mang lại cho bạn nhiều quyền kiểm soát hơn); chúng tôi có một kịch bản Powershell gọi MAGE.EXE để tạo tệp kê khai triển khai, một số Powershell khác để thao tác XML và loại bỏ phần tử <file> (thực sự dễ dàng với Powershell ... chúc may mắn thực hiện nó với một tệp batch!), sau đó chúng ta gọi MAGE.EXE để ký vào tệp kê khai.

+0

Câu trả lời hay! Tôi sẽ xem xét triển khai giải pháp của bạn. – ChrisNel52

0

Hợp nhất các gói nuget của bạn, nếu bạn có 2 tham chiếu phụ thuộc vào các phiên bản khác nhau của gói nuget thứ 3, đôi khi bạn có thể có 2 tham chiếu đến cùng một gói nuget. Điều này sẽ khiến Clickonce thất bại.