Kiểu được định nghĩa trong một assembly không được tham chiếu, làm thế nào để tìm ra nguyên nhân?


83

Tôi biết thông báo lỗi là phổ biến và có rất nhiều câu hỏi trên SO về lỗi này, nhưng không có giải pháp nào giúp tôi cho đến nay, vì vậy tôi quyết định đặt câu hỏi. Sự khác biệt với hầu hết các câu hỏi tương tự là tôi sử dụng thư mục App_Code.

Thông báo lỗi:

CS0012: The type 'Project.Rights.OperationsProvider' is defined in an
assembly that is not referenced. You must add a reference to assembly
'Project.Rights, version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Tệp Nguồn:

c:\inetpub\wwwroot\Test\Website\App_Code\Company\Project\BusinessLogic\Manager.cs

Làm theo các đề xuất ở đâyở đây , tôi đã xóa tất cả các phiên bản của Project.Rights.dll bên trong C: \ Windows \ Microsoft.NET /*.* Theo đó , tôi đã kiểm tra xem các tệp .cs được đề cập có đặt hành động xây dựng thành "Biên dịch" hay không . Họ làm. Tôi cũng đã kiểm tra kỹ xem tệp .cs có chứa loại "Project.Rights.OperationsProvider" có được triển khai vào thư mục App_Code hay không.

Vì một số lý do, ứng dụng không tìm kiếm loại trong thư mục App_Code. Vì tôi đã xóa tất cả các phiên bản của Project.Rights.dll (mà tôi biết), tôi không biết thông báo lỗi đang đề cập đến lắp ráp nào.


6
Bạn đang sử dụng một lớp (giả sử là A ) hiển thị một phương thức / thuộc tính / một cái gì đó thuộc loại Project.Rights.OperationsProvider. Trình biên dịch cần biết những gì sau đó nó sẽ tìm kiếm lắp ráp đó (Project.Rights). Nếu nó không tìm thấy nó (vì bạn không có tham chiếu đến nó trong dự án trang web của bạn) ... bạn sẽ gặp lỗi này. Giải pháp: KHÔNG tháo lắp ráp đó khỏi hệ thống của bạn !!! THÊM một tham chiếu đến nó.
Adriano Repetti

2
Hãy thử chuyển sang công cụ - tùy chọn - dự án và giải pháp - xây dựng và chạy - đặt cả hai chi tiết thành Chi tiết. Điều đó sẽ cho bạn biết phụ thuộc là gì và trình biên dịch đang tìm kiếm nó ở đâu.
danludwig

Câu trả lời:


99

Khi bạn gặp lỗi này, không phải lúc nào bạn cũng rõ ràng điều gì đang xảy ra, nhưng như lỗi cho biết - bạn đang thiếu một tham chiếu. Lấy dòng mã sau làm ví dụ:

MyObjectType a = new MyObjectType("parameter");

Nó trông đủ đơn giản và bạn có thể đã tham chiếu chính xác "MyObjectType". Nhưng giả sử một trong những quá tải đối với phương thức khởi tạo "MyObjectType" có kiểu mà bạn chưa tham chiếu đến. Ví dụ: có một quá tải được định nghĩa là:

public MyObjectType(TypeFromOtherAssembly parameter) {
    // ... normal constructor code ...
}

Đó là ít nhất một trường hợp mà bạn sẽ gặp lỗi này. Vì vậy, hãy tìm loại mẫu này mà bạn đã tham chiếu đến loại nhưng không phải tất cả các loại thuộc tính hoặc tham số phương thức có thể cho các hàm được gọi trên loại đó.

Hy vọng rằng điều này ít nhất giúp bạn đi đúng hướng!


16
Lưu ý về các phương thức mở rộng: nếu hai lớp có các phương thức mở rộng trùng tên, các tham số từ một kiểu có thể "lây nhiễm" việc sử dụng phương thức mở rộng từ một kiểu khác.
Athari

@Athari cảm ơn bạn, tôi sẽ không bao giờ đoán ra
Dave Cousineau

Chỉ cần bắt gặp câu trả lời này sau một lúc xem xét. Đây chính xác là vấn đề của tôi và lời giải thích của bạn rất hữu ích. Cảm ơn rất nhiều.
Diane

1
Nhưng nếu tôi không muốn sử dụng hàm tạo với tham chiếu thì sao? Tôi muốn sử dụng những cái khác, mà không cần thêm tham chiếu. Có vẻ như điều này là có thể.
Robert Iagar,

1
Điều này có vẻ thực sự kỳ lạ, nhưng tôi đã gặp lỗi này vì tôi đã có sự không khớp trong trường hợp của một trong các tên lắp ráp (có vẻ như nuget phân biệt chữ hoa chữ thường?)! Tôi đã có thư viện C tham chiếu thư viện B và A. Thư viện B cũng tham chiếu thư viện A nhưng đóng gói A dưới dạng phụ thuộc bằng cách sử dụng tên 'a' thay vì 'A'. Đang xây dựng thư viện C, tôi vẫn gặp lỗi này cho đến khi tôi sửa tên của phần phụ thuộc trong B!
Tolu

49

Kiểm tra khung mục tiêu trong các dự án.

Trong trường hợp của tôi, "Bạn phải thêm tham chiếu vào assembly" thực sự có nghĩa là, dự án trình gọi và tham chiếu không có cùng khung mục tiêu. Dự án trình gọi có .Net 4.5, nhưng thư viện được tham chiếu có mục tiêu 4.6.1.

Tôi chắc chắn rằng trình biên dịch MS có thể thông minh hơn và ghi thông báo lỗi có ý nghĩa hơn. Tôi đã thêm một đề xuất vào https://github.com/dotnet/roslyn/issues/14756


16

Trong trường hợp của tôi, điều này là do thực hiện cập nhật gói NuGet chỉ cập nhật các tham chiếu đến phụ thuộc dll trong một số nhưng không phải tất cả các dự án trong giải pháp của tôi - dẫn đến các phiên bản xung đột. Sử dụng công cụ kiểu grep để tìm kiếm văn bản trong các tệp * .csproj trong giải pháp của tôi, sau đó, thật dễ dàng để xem các dự án vẫn cần được cập nhật.


Cảm ơn vì câu trả lời này - Tôi nghĩ rằng đó là một cái gì đó gần với điều này nhưng rất vui khi thấy nó. Nói một cách khác - dự án mẹ (dịch vụ) của tôi gọi một phương thức khởi tạo với một tham số tùy chọn trong lớp dữ liệu của tôi không có tham chiếu đó được thêm vào .csproj. Việc so sánh các tệp .csproj con và mẹ sẽ làm sáng tỏ Nhóm mục không có trong nhóm mẹ.
Ryanman

3
Cửa sổ Visual Studio Package Manager dành cho Giải pháp (không dành cho từng dự án) có tab Hợp nhất , cho biết gói nào có các phiên bản khác nhau trong các dự án khác nhau. Nó có thể chứng minh tốt hơn so với grep giống như công cụ
Michael Freidgeim

7

Khi bạn gặp lỗi này, điều đó có nghĩa là mã bạn đang sử dụng tham chiếu đến một kiểu nằm trong một hợp ngữ, nhưng hợp ngữ không phải là một phần của dự án của bạn nên nó không thể sử dụng nó.

Xóa Project.Rights.dll là ngược lại với những gì bạn muốn. Bạn cần đảm bảo rằng dự án của bạn có thể tham chiếu lắp ráp. Vì vậy, nó phải được đặt trong Global Assembly Cache hoặc thư mục ~ / Bin của ứng dụng web của bạn.

Chỉnh sửa-Nếu bạn không muốn sử dụng hợp ngữ, thì xóa nó cũng không phải là giải pháp thích hợp. Thay vào đó, bạn phải xóa tất cả các tham chiếu đến nó trong mã của mình. Vì hợp ngữ không cần thiết trực tiếp bởi mã bạn đã viết, nhưng thay vào đó bằng thứ gì đó khác mà bạn đang tham chiếu, bạn sẽ phải thay thế hợp ngữ được tham chiếu đó bằng một thứ không có Project.Rights.dll làm phụ thuộc.


2
Tôi không thể sử dụng lắp ráp, đó là một yêu cầu. Tôi cần phải loại bỏ nó và lưu trữ lớp bên trong thư mục App_Code. Tôi biết nó nghe như thế nào, tin tôi đi. Được giao nhiệm vụ thay đổi một ứng dụng để tất cả logic nghiệp vụ được lưu trữ bên trong App_Code thay vì DLL ... không phải là điều thú vị.
afaf12

1
Không, có nghĩa là anh ấy đang sử dụng thứ gì đó có liên quan đến nó (không phải là anh ấy đang sử dụng trực tiếp). @ afaf12 nếu bạn phải loại bỏ nó ... bạn phải kiểm tra xem ai đang sử dụng nó (hãy tưởng tượng đây là một tham chiếu gián tiếp ). Bạn có thể không chỉ đơn giản là dán mã trong thư mục App_Code, bất kỳ biên soạn lắp ráp vẫn sẽ tham khảo ban đầu (trong và ngoài) một ...
Adriano Repetti

Tôi đã có một tương tự và bài viết của bạn đã giúp rất nhiều. Trong trường hợp của tôi, tôi đã tham chiếu đến hội đồng "A". Cụm này đã sử dụng một cụm "B" khác. Tôi tiếp tục gặp lỗi rằng cụm "B" bị thiếu mặc dù tôi đã thêm nó vào dự án của mình. Sau khi tôi sao chép assembly "B" vào thư mục bin của mình, vấn đề đã được giải quyết. Lý do là dự án của tôi không sử dụng assembly "B" nhưng assembly "A" đang sử dụng và nó không tìm thấy nó và do đó ném ra một ngoại lệ. Cảm ơn.
ykh

4

Trong trường hợp của tôi, tôi đang tham chiếu đến một thư viện được xây dựng sai Nền tảng / Cấu hình (tôi vừa tạo thư viện được tham chiếu).

Hơn nữa, tôi không thể khắc phục sự cố trong Trình quản lý cấu hình Visual Studio - không thể chuyển đổi và tạo Nền tảng và Cấu hình mới cho thư viện này. Tôi đã sửa nó bằng cách sửa các mục trong ProjectConfigurationPlatformsphần của .slntệp cho dự án đó. Tất cả các hoán vị của nó đã được đặt thành Debug|Any CPU(Tôi không chắc mình đã làm điều đó như thế nào). Tôi đã ghi đè các mục cho dự án bị hỏng bằng các mục cho một dự án đang hoạt động và thay đổi GUID cho mỗi mục.

Các mục nhập cho dự án đang hoạt động

{9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.ActiveCfg = Release|x64 {9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.Build.0 = Release|x64

Các mục nhập cho dự án bị hỏng

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Debug|Any CPU {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Debug|Any CPU

Các mục nhập bị lỗi hiện đã được sửa

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Release|x64 {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Release|x64

Tôi hi vọng điêu nay se giup được ai đo.


Đối với tôi nó cũng tương tự. VIsual Studio đã thay đổi GUID cho một số dự án của tôi từ FAE04EC0-301F-11D3-BF4B-00C04F79EFBC(C #) thành 9A19103F-16F7-4668-BE54-9A1E7A4F7556(ASP.NET). Sau khi tôi thay đổi chúng trở lại, mọi thứ diễn ra tốt đẹp.
scor4er

3

Nó chỉ xảy ra với tôi rằng các dự án khác nhau đang tham chiếu các bản sao khác nhau của cùng một dll. Tôi đảm bảo rằng tất cả đều tham chiếu đến cùng một tệp trên đĩa và lỗi đã biến mất như tôi mong đợi.


1

Nó không hoạt động đối với tôi khi tôi cố gắng thêm tham chiếu từ tab .NET Assemblies. Tuy nhiên, nó đã hoạt động khi tôi thêm tham chiếu với BROWSE vào C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319


0

một trong những lý do chính có thể là thuộc tính của DLL trước khi bạn phải làm bất kỳ điều gì để kiểm tra xem specific version propertynó có đúng hay không

Lý do: có thể mã nguồn được kết hợp với phiên bản (cũ) khác khi bạn xây dựng nó, nhưng Thư viện này đã nâng cấp với bản cập nhật mới, phiên bản hiện khác trong Assembly Cash và ứng dụng của bạn bị cấm tải DLL mới và sau khi vô hiệu hóa specific version propertyapplacaten của bạn sẽ miễn phí để tải phiên bản mới của tham chiếu DLL


0

Có thể một thư viện (tệp DLL) bạn đang sử dụng yêu cầu một thư viện khác. Trong trường hợp của tôi, tôi đã tham chiếu đến một thư viện có chứa mô hình thực thể cơ sở dữ liệu - nhưng tôi quên tham chiếu đến thư viện khung thực thể.


0

Điều này cũng có thể có nghĩa là bạn sử dụng thư viện, nơi hiển thị các loại (công khai) được xác định trong thư viện. Ngay cả khi bạn không sử dụng chúng đặc biệt trong thư viện của mình ( thư viện không được xây dựng).

Điều mà điều này có thể ngăn cản là bạn viết mã sử dụng một lớp (trong chữ ký của nó có các kiểu từ thư viện không được tham chiếu) mà bạn không thể sử dụng.


0

Đối với tôi lý do tại sao lỗi xuất hiện là do WebForm nơi báo lỗi đã được chuyển từ một thư mục khác, nhưng tên của lớp tệp mã của nó vẫn không thay đổi và không tương ứng với đường dẫn thực tế.

Trạng thái ban đầu:
Đường dẫn tệp gốc: /Folder1/Subfolder1/MyWebForm.aspx.cs Tên lớp tệp
gốc: Folder1_Subfolder1_MyWebForm

Sau khi tệp được di chuyển:
Đường dẫn tệp: /Folder1/MyWebForm.aspx.cs
Tên lớp tệp mã (không thay đổi, với lỗi hiển thị): Folder1_Subfolder1_MyWebForm

Giải pháp:
Đổi tên lớp tệp mã của bạn Folder1_Subfolder1_MyWebForm
thành một lớp tương ứng với đường dẫn mới :Folder1_MyWebForm

Tất cả cùng một lúc - vấn đề được giải quyết, không báo cáo lỗi ..


0

Loại 'Domain.tblUser' được định nghĩa trong một hội đồng không được tham chiếu. Bạn phải thêm một tham chiếu đến assembly 'Miền, Phiên bản = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = null'.

**Solved:**
 Add reference of my domain library layer to my web app libary layer

Lưu ý: Đảm bảo rằng các tham chiếu của bạn là chính xác theo vùng chứa DI của bạn


0

Trong trường hợp của tôi, điều này là do tôi đã sử dụng

Nhà điều hành ngầm

giữa BLLvà các DALlớp. Khi tôi muốn sử dụng BLLLớp Trong Lớp Ứng dụng, tôi gặp lỗi này. tôi đã thay đổi

toán tử ngầm

đến

toán tử rõ ràng

không sao đâu. Cảm ơn


0

Trong trường hợp của tôi, phiên bản của dll được tham chiếu thực sự mới hơn phiên bản mà tôi đã có trước đây.

Tôi chỉ cần quay lại bản phát hành trước đó và điều đó đã sửa nó.


0

Đối với tôi, điều này được gây ra bởi dự án cả trực tiếp và gián tiếp (thông qua một phụ thuộc khác) tham chiếu đến hai công trình xây dựng khác nhau của Lâu đài Bouncy có tên lắp ráp khác nhau. Một trong những bản dựng của Lâu đài Bouncy là gói NuGet, bản còn lại là bản dựng gỡ lỗi của nguồn được tải xuống từ GitHub. Cả hai đều là phiên bản 1.8.1 trên danh nghĩa, nhưng cài đặt dự án của mã GitHub đặt tên hợp ngữ thành BouncyCastle trong khi gói NuGet có tên hợp ngữ là BouncyCastle.Crypto. Thay đổi cài đặt dự án, do đó căn chỉnh tên lắp ráp, đã khắc phục sự cố.


1
Tôi khuyên bạn có thể làm cho câu trả lời của mình hữu ích hơn bằng cách giải thích cách bạn đã sửa nó.
Stephen Kennedy

0

Tôi gặp sự cố tương tự và tôi xóa RuntimeFrameworkVersion và sự cố đã được khắc phục.

Cố gắng xóa 1.1.1 hoặc


0

Tôi gặp sự cố này trên một giải pháp mới được tạo sử dụng các dự án hiện có. Vì lý do nào đó, một dự án không thể "nhìn thấy" một dự án khác, mặc dù nó có cùng tham chiếu với mọi dự án khác và dự án được tham chiếu cũng đang được xây dựng. Tôi nghi ngờ rằng nó đã không phát hiện ra điều gì đó liên quan đến nhiều khuôn khổ mục tiêu, bởi vì nó đang xây dựng trong một khuôn khổ chứ không phải khung kia.

Làm sạch và xây dựng lại không hoạt động và khởi động lại VS không hoạt động.

Những gì cuối cùng đã hoạt động là mở "Dấu nhắc lệnh của nhà phát triển cho VS 2019" và sau đó đưa ra một msbuild MySolution.slnlệnh. Điều này đã hoàn thành thành công, và sau đó VS cũng bắt đầu xây dựng thành công.


-3

Làm sạch giải pháp của bạn và xây dựng lại làm việc cho tôi (trong Visual Studio, đây là các tùy chọn bạn nhận được khi nhấp chuột phải vào trình khám phá giải pháp của mình), lỗi đã biến mất trong dự án của tôi.

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.