.Net chọn sai phiên bản lắp ráp tham chiếu


141

Tôi vừa sao chép một dự án hiện có vào một máy hoàn toàn mới để bắt đầu phát triển nó và đã gặp vấn đề với phiên bản của một trong các hội đồng tham chiếu của tôi (một telerik DLL khi nó xảy ra).

Dự án ban đầu tham chiếu một phiên bản cũ hơn của hội đồng (hãy gọi nó là v1.0.0.0). Máy mới của tôi đã cài đặt phiên bản lắp ráp mới nhất, vì vậy tôi nghĩ rằng tôi đã cập nhật nó (hãy gọi phiên bản mới v2.0.0.0).

Bây giờ đây là vấn đề: Nếu tôi sao chép dll v1.0.0.0 cũ vào thư mục dự án và thêm nó làm tài liệu tham khảo, trang web sẽ khởi chạy mà không gặp vấn đề gì. Nếu tôi xóa tham chiếu đó (và cũng xóa DLL cũ khỏi hệ thống của tôi) và thêm phiên bản mới (v2.0.0.0), trang sẽ hiển thị ngoại lệ sau:

Không thể tải tệp hoặc lắp ráp 'XXXXXX, Phiên bản = 1.0.0.0, Văn hóa = trung tính, PublicKeyToken = 121fae78165ba3d4' hoặc một trong các phụ thuộc của nó. Định nghĩa tệp kê khai của cụm lắp ráp không khớp với tham chiếu lắp ráp. (Ngoại lệ từ HRESULT: 0x80131040)

Rõ ràng, mã đang tìm phiên bản lỗi thời và không thể tìm thấy nó. Nhưng tại sao?

Tôi đã lấy thư mục giải pháp cho số phiên bản đó và không thể tìm thấy một tài liệu tham khảo nào. Tôi đã kiểm tra lại văn bản của tệp .csproj và thấy phiên bản hiển thị chính xác phiên bản mới nhất và HintPath hiển thị chính xác đường dẫn đến DLL mới. Hơn nữa, vì tôi không cài đặt DLL cũ trên hệ thống nên nó không hiển thị trong GAC của tôi (mặc dù v2.0.0.0, như mong đợi).

Sau đó, tôi đã kích hoạt trình xem nhật ký hợp nhất để cố gắng tìm hiểu tại sao nó tìm phiên bản cũ đó, nhưng không gặp may:

Assembly Load Trace: The following information can be helpful to determine why the assembly 'XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4' could not be loaded.


=== Pre-bind state information ===
LOG: User = MyComp\me
LOG: DisplayName = XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
 (Fully-specified)
LOG: Appbase = file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/
LOG: Initial PrivatePath = d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\bin
Calling assembly : WebApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\web.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX/XXXXXX.DLL.
LOG: Attempting download of new URL file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/bin/XXXXXX.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Tất cả nói rằng nó bắt đầu bằng cách tìm kiếm lắp ráp cũ. Tôi đã cố gắng tìm một giải pháp trực tuyến và thấy câu hỏi SO tương tự này , nhưng dường như nó hoàn toàn ngược lại với vấn đề của tôi. Chương trình của người hỏi đó đã tìm thấy DLL sai thay vì tham chiếu. Trong khi đó, vấn đề của tôi là chương trình đang tìm kiếm DLL sai và không thể tìm thấy nó khi có thể tìm thấy đúng địa chỉ trong thư mục bin và trong GAC.

Tại sao tôi tìm kiếm phiên bản cũ? Tôi có thể tìm kiếm ở đâu để tìm tài liệu tham khảo xấu này?

Câu trả lời:


151

Tôi đoán là một hội đồng khác mà bạn đang sử dụng đang tham khảo dll cũ. Bạn có quen thuộc với tất cả các tài liệu tham khảo dự án khác đang được sử dụng và có ai trong số chúng có tham chiếu đến các dll Telerik không?

Bạn có thể đặt một chuyển hướng ràng buộc trong tệp web.config như thế này không?

<dependentAssembly>
 <assemblyIdentity name="Telerik" publicKeyToken="121fae78165ba3d4"/>
 <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>

12
Tôi đã có tất cả các loại vấn đề tương tự như vậy với các phiên bản khác nhau đang tải / không tải. Một mẹo khác bạn có thể thử là xóa thủ công tất cả các tệp trong thư mục C: /WINDOWS/Microsoft.NET/Framework/v4.0.30319/T tạm thời của tập tin ASP.NET / root / 90233b18 / 10d54998. Đôi khi, khi biên dịch lại các trang web, ASP.Net không xóa thư mục đó vì một số khóa tệp và các dll đó có thể bị treo trên các tham chiếu cũ. Nó đáng để thử, tôi biết nó đã làm việc cho tôi trong quá khứ.
Chris Conway

1
Bạn đã giải quyết một vấn đề liên quan cho tôi - cảm ơn! Một biểu mẫu được kế thừa trong ứng dụng C # của tôi sẽ không mở trong trình thiết kế vì nó đang tìm phiên bản cũ của một tham chiếu. Hóa ra một tài liệu tham khảo khác ban đầu được xây dựng trong khi tham chiếu phiên bản cũ của tài liệu tham khảo vấn đề.
Sam Skuce

2
Nếu bạn đang đi lang thang về cú pháp: msdn.microsoft.com/en-us/l
Library / 0ash1ksb.aspx

1
Cảm ơn Chris! Bạn đã giải quyết vấn đề của tôi ở đây: stackoverflow.com/q/11490177/7850
Shaul Behr

3
Bạn cũng có thể xem trong App.config hoặc web.config và xem các <dependentAssembly>mục hiện có có gây ra sự cố không.
Roy Tinker

24

Tôi với Chris Conway về điều này (nâng cao anh ta). Vấn đề là bạn đang tham khảo một trong những hội đồng telerik trong dự án của bạn, tham chiếu đến một hội đồng khác không có ở đó.

Điều đầu tiên: Tôi sẽ không cài đặt bất kỳ nhà cung cấp nào (ví dụ: telerik) vào GAC. Nội dung của Telerik được tổng hợp thành hai hội đồng (telerik.web.design và telerik.web.ui). Chỉ cần triển khai những người có ứng dụng.

Thứ hai, trong mỗi tệp .proj của bạn (như .csproj) sẽ có một <reference include..>tệp trỏ đến tệp Telerik.Web.UI. Điều này thường chứa một số phiên bản. Đảm bảo lắp ráp bạn đặt trong thư mục bin khớp với phiên bản đó.

Thứ ba, đảm bảo TẤT CẢ các dự án của bạn sử dụng lắp ráp mới nhất. Ngoài ra, hãy chắc chắn rằng họ đang lấy lắp ráp từ một đường dẫn cục bộ thay vì GAC. (Tôi thực sự không thích GAC. Nó không gây ra vấn đề gì cho một số dự án tôi đã thực hiện). Chúng tôi thường có một thư mục "Tập hợp" mà tất cả các dự án sử dụng cho các tham chiếu lắp ráp bên ngoài.

Thứ tư, visual studio tự động tìm kiếm gac của bạn mỗi khi dự án trang web được tải và nhắm mục tiêu các vị trí lắp ráp nếu nó tìm thấy thứ gì đó trong gac. Tôi không thể nhớ nếu nó từng làm điều này cho các dự án ứng dụng web, nhưng tôi đã không gặp vấn đề trong một thời gian dài với những dự án đó. Điều này có thể gây ra vấn đề tương tự trong quá trình triển khai.

Thứ năm, bạn có thể rebind số phiên bản cho các cụm trong web.config. Trong runtime/assemblybindingphần này, bạn có thể sử dụng một cái gì đó như sau để đưa mọi lắp ráp telerik được triển khai trong năm 2008 và chỉ ra một phiên bản rất đặc biệt:

  <dependentAssembly>
    <assemblyIdentity name="Telerik.Web.UI" publicKeyToken="121fae78165ba3d4" />
    <bindingRedirect oldVersion="2008.0.0.0-2020.0.0.0" newVersion="2010.02.0713.35" />
  </dependentAssembly>

2
Ý tôi là "cảm thấy", điều đó đã làm phiền tôi trong nhiều tháng nay :)
Michael La Voie

21

Tôi đã thử hầu hết các câu trả lời nhưng vẫn không thể làm cho nó hoạt động. Điều này làm việc cho tôi:

nhấp chuột phải vào tham chiếu -> thuộc tính -> thay đổi 'Phiên bản cụ thể' thành sai.

nhập mô tả hình ảnh ở đây

Hi vọng điêu nay co ich.


30
Đó là những gì bỏ phiếu +1 có nghĩa.
xr280xr

7
Nhưng đôi khi, upvote đơn giản chỉ không đủ tổng hợp mức độ vui vẻ và nhẹ nhõm của câu trả lời khiến bạn - sau khi đã dành hàng giờ để cố gắng khắc phục một vấn đề ngớ ngẩn thậm chí không phải là một vấn đề và bạn cố gắng giải quyết nó theo một cách khác , bắt gặp một câu trả lời khác với những gì bạn đã thử trước đây và bùng nổ! nó hoạt dộng bây giờ! Sau tất cả những điều đó, đôi khi chỉ cần nhấn nút upvote sẽ không công bằng với cảm giác áp đảo đó, anh bạn, tôi thực sự đã cứu tôi ra khỏi cái này.
Michael Plautz

7

Thử:

  • làm sạch tập tin dự án tạm thời
  • làm sạch tập tin xây dựng và obj
  • làm sạch các phiên bản cũ được cài đặt tại C:\Users\USERNAME\.nuget\packages\

Điều đó làm việc cho tôi.


1
Làm sạch thư mục C: \ Users \ USERNAME \ .nuget \ tests \ là những gì tôi bị thiếu. Cảm ơn rất nhiều!
Herdo

đối với phiên bản nuget cũ, trong máy tính dựa trên windows, ckuck Bắt đầu và tìm kiếm "chạy"> sao chép và dán "% userprofile% \. nuget \ gói" - điều này sẽ mở thư mục phiên bản
nuget

3
  1. Truy cập C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG
  2. Tìm tập tin machine.config
  3. mở trong notepad
  4. tìm xung đột dll
  5. Loại bỏ điều này và tiết kiệm.

tập hợp biên dịch

addassinstall = dllName, Version = 1.0.0000.0000 Culture = trung tính, PublicKeyToken = "QWEWQERWETERY"

biên soạn tập hợp

làm việc cho tôi


2
Tôi cũng phát hiện ra cơn ác mộng này - ngay cả khi bạn gỡ bỏ lắp ráp khỏi GAC, nó vẫn để lại các tham chiếu phiên bản sai trong "C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ machine.config"
Evalds Urtans

3

Đây không phải là một câu trả lời rõ ràng về lý do tại sao, nhưng chúng tôi đã có vấn đề này, đây là hoàn cảnh của chúng tôi và điều gì đã giải quyết nó:

Nhà phát triển 1:

Giải pháp chứa Dự án A tham chiếu Gói NuGet và Dự án MVC tham chiếu Dự án A. Đã bật Khôi phục Gói NuGet, sau đó cập nhật gói NuGet. Có một lỗi thời gian chạy phàn nàn về lib NuGet không thể được tìm thấy - nhưng lỗi là do nó đang tìm phiên bản cũ hơn, không cập nhật. Giải pháp (và điều này thật lố bịch): Đặt điểm dừng trên dòng mã đầu tiên trong dự án MVC gọi Project A. Bước vào với F11. Đã giải quyết - không bao giờ có vấn đề nữa.

Nhà phát triển 2:

Cùng một giải pháp và dự án, nhưng điểm dừng kỳ diệu và bước trong giải pháp không hoạt động. Tìm kiếm khắp nơi để chuyển hướng phiên bản hoặc các tham chiếu xấu khác cho gói Nuget này, gỡ bỏ gói và cài đặt lại, xóa sạch bin, obj, Asp.Net Temp, không có gì giải quyết được. Cuối cùng, đổi tên thành Project A, chạy dự án MVC - đã sửa. Đổi tên nó trở lại tên ban đầu của nó, nó vẫn cố định.

Tôi không có bất kỳ lời giải thích nào về lý do tại sao nó hoạt động, nhưng nó đã giúp chúng tôi thoát khỏi tình trạng khập khiễng nghiêm trọng.


2

Bạn có dự án nào khác trong giải pháp đó không? (Có thể là một dự án khác đang tham khảo một phiên bản cũ) Thông thường trong VS, phụ thuộc dll kéo dài tất cả các dự án trong giải pháp.


Không có dự án nào khác trong giải pháp và không có DLL tham chiếu nào khác tham chiếu telerik. Tôi chỉ tham khảo Hệ thống MS DLLs ala. *
Michael La Voie

2

Vấn đề của tôi là các tập hợp cũ nằm trong thư mục _bin_deployableAssemblies trong Ứng dụng Web. Điều này có nghĩa là các hội đồng cũ đã ghi đè lên các hội đồng GAC khi xây dựng dự án.


2

Trong trường hợp là cứu người khác 3 giờ ... trường hợp của tôi hơi khác một chút. Mã của tôi đã sử dụng DevExpress v11.1 v11.1.4.0. Tôi đã có tất cả các tham chiếu chính xác trong mã của tôi. Nhưng trình cấu hình bộ nhớ .net đã cài đặt DevExpress v11.1 v11.1.12.0 trong GAC. Trong thực tế, đó không phải là các thành phần tôi đã tham chiếu nhưng các thành phần mà họ tham chiếu trong nội bộ đã thất bại. Hãy thử hết sức có thể, GAC luôn được kiểm tra trước. Nó được biên dịch và chạy tốt nhưng tôi không thể xem trình thiết kế biểu mẫu win và dấu vết ngăn xếp không giúp ích được gì cả. Cuối cùng gỡ cài đặt bộ nhớ .net profiler và tất cả đã được khôi phục.


2

Tôi gặp vấn đề tương tự và tôi phải xóa mọi thứ khỏi thư mục bin và obj và xây dựng lại để vượt qua vấn đề của mình. Hi vọng điêu nay co ich.


1

Nếu bạn gặp phải sự cố này khi kiểm tra và / hoặc gỡ lỗi ứng dụng khỏi môi trường Visual Studio (Máy chủ phát triển ASP.NET), cần phải xóa tất cả các tệp tạm thời trên thư mục trang web phát triển. Để biết thư mục đó ở đâu, hãy tìm biểu tượng Máy chủ Phát triển ASP.NET trên biểu tượng khay Windows (cần có tiêu đề như thế này: Máy chủ Phát triển ASP.NET - Cổng ####), nhấp chuột phải vào biểu tượng và chọn Hiển thị Chi tiết; thn, trường Đường dẫn vật lý sẽ cho bạn biết thư mục tạm thời là gì, tất cả các mục nên được xóa để giải quyết vấn đề. Xây dựng và chạy lại trang web và vấn đề cần được giải quyết (một lần nữa, giải quyết cho Môi trường phát triển).


1

Tôi đã có cùng một vấn đề với các hội đồng khác nhau tham chiếu các phiên bản khác nhau của Newtonsoft.json. Giải pháp hiệu quả với tôi là chạy gói cập nhật từ Bảng điều khiển quản lý gói Nuget.


1

Lỗi này có phần sai lệch - Tôi đã tải một số DLL yêu cầu kiến ​​trúc x64 được chỉ định. Trong .csprojtập tin:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release-ABC|AnyCPU'">
    <OutputPath>bin\Release-ABC</OutputPath>
    <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

Một mất tích PlatformTargetgây ra lỗi này.


1

Tôi đã nhận được:

Không thể tải tệp hoặc lắp ráp 'XXX-new-3.3.0.0' hoặc một trong các phụ thuộc của nó. Định nghĩa tệp kê khai của cụm lắp ráp không khớp với tham chiếu lắp ráp. (Ngoại lệ từ HRESULT: 0x80131040)

Đó là bởi vì tôi đã thay đổi tên của hội đồng từ XXX.dllđến XXX-new-3.3.0.0.dll. Hoàn nguyên tên đã trở lại ban đầu đã sửa lỗi.


Đúng - bao gồm một phiên bản trong tên trong thư viện lắp ráp chung của chúng tôi để tránh các vấn đề về đặt tên trong kiểm soát nguồn. Thay đổi tên trở lại và cập nhật thủ công các đường dẫn tham chiếu / gợi ý và tất cả đều hoạt động.
Mathew Paxinos

0

Nó gần giống như bạn phải quét sạch máy tính của bạn để thoát khỏi dll cũ. Tôi đã thử mọi thứ ở trên và sau đó tôi đã thực hiện thêm một bước là chỉ xóa mọi phiên bản của tệp .DLL trên máy tính của mình và xóa mọi tham chiếu khỏi ứng dụng. Tuy nhiên, nó vẫn biên dịch tốt và khi nó chạy, nó tham chiếu các hàm dll tốt. Tôi bắt đầu tự hỏi nếu nó đang tham chiếu nó từ một ổ đĩa mạng nào đó.


0

Tôi đã có cùng một thông báo khi chuyển đổi giữa hai phiên bản của một ứng dụng tham chiếu các phiên bản khác nhau của cùng một DLL. Mặc dù tôi đang thử nghiệm trong các thư mục khác nhau nhưng tôi vô tình sao chép phiên bản mới hơn phiên bản cũ hơn.

Vì vậy, điều đầu tiên cần kiểm tra là phiên bản của DLL được tham chiếu trong thư mục của ứng dụng. Chỉ trong trường hợp.


0

Có lẽ điều này giúp hoặc có thể không. Tôi đã dọn sạch các phiên bản gỡ lỗi và phát hành của mình sau đó tôi đổi tên thư mục OBJ. Điều này cuối cùng đã cho tôi thorugh. Các bước trước đó về cơ bản là loại bỏ các tham chiếu và chúng thêm chúng trở lại tại các thuộc tính của dự án.


0

Trong My Visual Studio 2015, tôi đảm bảo rằng Danh sách đường dẫn tham chiếu của dự án Visual Studio bị trống:

nhập mô tả hình ảnh ở đây


Bạn đã đăng cùng một câu trả lời cho 2 câu hỏi khác nhau?
AK47

0

Đây là những gì làm việc cho tôi:

Tôi đã sử dụng Microsoft.IdentityModel.Clients.ActiveDirectoryphiên bản 3.19 trong một dự án thư viện lớp nhưng chỉ có phiên bản 2.22 được cài đặt trong dự án ứng dụng web ASP.NET thực tế. Nâng cấp lên 3.19 trong dự án ứng dụng web đã giúp tôi vượt qua lỗi.


0

Trong trường hợp của tôi, tôi đã có 3 dự án, 1 dự án chính và 2 dự án phụ được tham chiếu bởi dự án chính .. Vì vậy, tôi đã cập nhật dự án chính, bỏ dự án phụ. Đó là nơi xảy ra xung đột. Sau khi tôi cập nhật tất cả các dự án của tôi, mọi thứ đều hoạt động tốt.


0

Trong VS2017, đã thử tất cả các giải pháp trên nhưng không có gì hoạt động. Chúng tôi đang sử dụng Azure devops để tạo phiên bản.

  1. Từ trình thám hiểm nhóm> Trình điều khiển nguồn

nhập mô tả hình ảnh ở đây

  1. Chọn dự án khiến bạn thất vọng trong một thời gian dài

  2. Nhấp chuột phải vào chi nhánh hoặc giải pháp> Nâng cao> nhận phiên bản cụ thể

nhập mô tả hình ảnh ở đây

  1. Sau đó, đảm bảo Bạn đã đánh dấu vào hộp kiểm ghi đè các tệp theo ảnh chụp màn hình

nhập mô tả hình ảnh ở đây


0

Trong trường hợp của tôi, tôi đã vô tình chọn phiên bản sai của gói Telerik từ nuget, sau đó nuget đã thay thế mọi gói tôi tham chiếu với phiên bản không chính xác. Sau đó, nó chèn một chuyển hướng ràng buộc vào phiên bản không chính xác để ngay cả sau khi tôi thay thế mọi thứ bằng phiên bản chính xác, nó vẫn tìm kiếm phiên bản không chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.