Тип визначається у збірці, на яку немає посилань. Як знайти причину?


83

Я знаю, що повідомлення про помилку є загальним, і в SO є багато запитань щодо цієї помилки, але досі мені не допомогли рішення, тому я вирішив поставити запитання. Різниця в більшості подібних питань полягає в тому, що я використовую каталог App_Code.

Повідомлення про помилку:

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'.

Вихідний файл:

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

Слідуючи пропозиціям тут і тут , я видалив усі екземпляри Project.Rights.dll всередині C: \ Windows \ Microsoft.NET /*.* Відповідно до цього , я перевірив, чи є у цих файлах .cs встановлена ​​дія компіляції "Компіляція" . Вони роблять. Я також двічі перевірив, що файл .cs, що містить тип "Project.Rights.OperationsProvider", розгортається в каталозі App_Code.

З якоїсь причини програма не шукає тип у каталозі App_Code. Оскільки я видалив усі екземпляри Project.Rights.dll (про які я знаю), я не знаю, про яку збірку згадується в повідомленні про помилку.


6
Ви використовуєте клас (скажімо A ), який виставляє метод / властивість / щось типу Project.Rights.OperationsProvider. Компілятор повинен знати, що це, тоді він здійснить пошук у цій збірці (Project.Rights). Якщо він не знаходить його (оскільки у вас немає посилання на нього у проекті веб-сайту) ... ви отримуєте цю помилку. Рішення: НЕ виймайте цю збірку з вашої системи !!! ДОДАТИ посилання на нього.
Адріано Репетті,

2
Спробуйте перейти до інструментів - варіантів - проектів та рішень - побудувати та запустити - встановити для обох деталей детальний опис. Це покаже вам, що таке залежність і де компілятор її шукає.
danludwig

Відповіді:


100

Коли ви отримуєте цю помилку, не завжди очевидно, що відбувається, але, як говорить помилка, вам бракує посилання. Візьмемо наступний рядок коду як приклад:

MyObjectType a = new MyObjectType("parameter");

Це виглядає досить просто, і ви, мабуть, правильно вказали "MyObjectType". Але скажімо, одна з перевантажень конструктора "MyObjectType" приймає тип, на який ви не посилаєтесь. Наприклад, є перевантаження, що визначається як:

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

Це принаймні один випадок, коли ви отримаєте цю помилку. Отже, шукайте цей тип шаблону там, де ви вказали тип, але не всі типи властивостей або параметрів методу, які можливі для функцій, що викликаються для цього типу.

Сподіваємось, це принаймні змусить вас рухатись у правильному напрямку!


16
Примітка щодо методів розширення: якщо два класи мають методи розширення з однаковим ім'ям, параметри одного типу можуть "заразити" використання методу розширення іншого типу.
Athari

@Athari дякую, я ніколи б цього не зрозумів
Дейв Кусіно,

Просто натрапив на цю відповідь через деякий час дивлячись. Це саме моя проблема, і ваше пояснення було дуже корисним. Дякую навантаження.
Діана

1
Але що, якщо я не хочу використовувати конструктор із посиланням? Я хочу використовувати інші, не додаючи посилання. Здається, це повинно бути можливим.
Роберт Іагар,

1
Це здається справді дивним, але я отримав цю помилку, оскільки мав невідповідність у випадку одного з назв збірки (схоже, nuget чутливий до регістру?)! У мене була бібліотека C довідкових бібліотек B і A. Бібліотека B також посилалася на бібліотеку A, але упакована як залежність, використовуючи назву "a", а не "A". Будуючи бібліотеку C, я постійно отримував цю помилку, поки не виправив назву залежності в B!
Толу

49

Перевірте цільову структуру в проектах.

У моєму випадку "Ви повинні додати посилання на збірку" насправді означало, що викликаючі та посилальні проекти не мали однакової цільової структури. Проект, що викликає, мав .Net 4.5, але бібліотека, на яку посилаються, мала на меті 4.6.1.

Я впевнений, що компілятор MS може бути розумнішим і реєструвати більш значущі повідомлення про помилки. Я додав пропозицію до https://github.com/dotnet/roslyn/issues/14756


16

У моєму випадку це було тому, що оновлення пакета NuGet мало лише оновлені посилання на залежність dll у деяких, але не у всіх проектах у моєму рішенні - що призводило до конфліктних версій. Використовуючи інструмент у стилі grep для пошуку тексту у файлах * .csproj у моєму рішенні, тоді було легко побачити проекти, які ще потрібно оновити.


Дякую за цю відповідь - я зрозумів, що це щось близьке до цього, але був радий бачити це. Іншими словами - у моєму батьківському проекті (службі), що викликає конструктор із необов’язковим параметром на моєму рівні даних, не було додано це посилання до .csproj. Порівняння дочірнього та батьківського файлів .csproj повинно висвітлити елемент ItemGroup, який повинен знаходитись у батьківському, що не є.
Райанман,

3
У вікні диспетчера пакунків Visual Studio для рішення (не для окремого проекту) є вкладка « Консолідація », яка показує, які пакети мають різні версії в різних проектах. Це виявляється краще, ніж grep-подібний інструмент
Michael Freidgeim

7

Коли ви отримуєте цю помилку, це означає, що код, який ви використовуєте, робить посилання на тип, який знаходиться у збірці, але збірка не є частиною вашого проекту, тому вона не може її використовувати.

Видалення Project.Rights.dll є протилежністю до того, що ви хочете. Потрібно переконатися, що ваш проект може посилатися на збірку. Отже, він повинен бути розміщений у кеш-пам’яті глобальної збірки або у каталозі ~ / Bin вашого веб-додатку.

Редагувати - якщо ви не хочете використовувати збірку, видалення її теж не є належним рішенням. Натомість ви повинні видалити всі посилання на нього у своєму коді. Оскільки збірка безпосередньо не потрібна коду, який ви написали, а замість чогось іншого, на що ви посилаєтесь, вам доведеться замінити цю згадану збірку на щось, що не має Project.Rights.dll як залежність.


2
Я не можу використовувати збірку, це вимога. Мені потрібно від нього позбутися і зберегти клас у каталозі App_Code. Я знаю, як це звучить, повірте. Бути дорученим змінити програму, щоб вся ділова логіка зберігалася всередині App_Code замість DLL ... не цікаво.
afaf12

1
Ні, це означає, що він використовує щось із посиланням на нього (не те, що він використовує безпосередньо). @ afaf12 якщо вам потрібно від нього позбутися ... вам потрібно перевірити, хто цим користується (уявіть це як непряме посилання). Ви не можете просто вставити код в каталог App_Code, будь-яка скомпільована збірка все одно посилатиметься на оригінальну (і зовнішню) ...
Адріано Репетті

У мене було подібне, і ваш пост дуже допоміг. У моєму випадку я мав посилання на збірку "А". Ця збірка використовувала іншу збірку "B". Я постійно отримував повідомлення про помилку, що збірка "B" відсутня, хоча я додав її до свого проекту. Як тільки я скопіював збірку "B" до мого каталогу bin, проблема була вирішена. Причина полягає в тому, що в моєму проекті не використовувалася збірка "B", а використовувалася збірка "A", і вона її не знайшла, а отже, вилучити виняток. Дякую.
ykh

4

У моєму випадку я посилався на бібліотеку, яку будували, на неправильну платформу / конфігурацію (я щойно створив бібліотеку, на яку посилаються).

Крім того, мені не вдалося вирішити проблему в Visual Studio Configuration Manager - не вдалося переключитись і створити нові платформи та конфігурації для цієї бібліотеки. Я виправив це, виправивши записи у ProjectConfigurationPlatformsрозділі .slnфайлу для цього проекту. Для всіх його перестановок було встановлено значення Debug|Any CPU(я не впевнений, як я це зробив). Я замінив записи для непрацюючого проекту на записи для робочого проекту та змінив GUID для кожного запису.

Записи для функціонуючого проекту

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

Записи для пошкодженого проекту

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

Виправлено пошкоджені записи

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

Сподіваюся, це комусь допомагає.


Для мене це було схоже. VIsual Studio змінили GUID для деяких моїх проектів з FAE04EC0-301F-11D3-BF4B-00C04F79EFBC(C #) на 9A19103F-16F7-4668-BE54-9A1E7A4F7556(ASP.NET). Після того, як я їх змінив назад, все пройшло добре.
scor4er

3

Просто зі мною трапилось, що різні проекти посилаються на різні копії однієї і тієї ж DLL. Я переконався, що всі посилаються на один і той же файл на диску, і помилка зникла, як я очікував.


1

Мені це не вдалося, коли я намагався додати посилання з вкладки .NET Assembly. Однак це спрацювало, коли я додав посилання з BROWSE до C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319


0

однією з головних причин може бути властивість DLL, яку потрібно виконати перед тим, як зробити будь-яку річ, щоб перевірити, specific version propertyчи відповідає вона істині, помилково

Причина: можливо, вихідний код приєднався до іншої (старої) версії, коли ви його specific version propertyстворюєте , але ця бібліотека оновлена ​​новим оновленням, версія тепер відрізняється від Assembly Cash, і вашій програмі заборонено отримувати нову бібліотеку DLL, і після відключення ваш applacaten буде безкоштовним отримати нову версію посилань DLL


0

Можливо, бібліотеці (файлу DLL), яку ви використовуєте, потрібна інша бібліотека. У моєму випадку я посилався на бібліотеку, яка містила модель сутності бази даних, але я забув посилатися на бібліотеку фреймворку сутності.


0

Це також може означати, що ви використовуєте бібліотеку, яка надає (загальнодоступні) типи, визначені в бібліотеці. Навіть коли ви не використовуєте їх спеціально у своїй бібліотеці (тій, яка не будується).

Це, напевно, заважає писати код, який використовує клас (який у своєму підписі має типи з бібліотеки, на які не посилається), який ви не можете використовувати.


0

Для мене причиною появи помилки було те, що WebForm, де повідомлялося про помилку, було переміщено з іншої папки, але ім'я класу кодового файлу залишилось незмінним і не відповідало фактичному шляху.

Початковий стан:
Оригінальний шлях до файлу: /Folder1/Subfolder1/MyWebForm.aspx.cs Ім'я
оригінального класу кодового файлу: Folder1_Subfolder1_MyWebForm

Після переміщення
файлу : Шлях до файлу: /Folder1/MyWebForm.aspx.cs Ім'я класу кодового
файлу (без змін, із відображеною помилкою): Folder1_Subfolder1_MyWebForm

Рішення:
Перейменуйте клас кодового файлуFolder1_Subfolder1_MyWebForm
до одного відповідним з новим шляхом :Folder1_MyWebForm

Все відразу - проблема вирішена, повідомлення про помилки відсутні ..


0

Тип 'Domain.tblUser' визначений у збірці, на яку немає посилань. Ви повинні додати посилання на збірку "Домен, версія = 1.0.0.0, культура = нейтральна, PublicKeyToken = нуль".

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

Примітка: Переконайтесь, що ваші посилання правильні відповідно до вашого контейнера DI


0

У моєму випадку це було тому, що я використовував

Неявний оператор

між BLLі DALкласами. коли я хочу використовувати BLLшар у рівні програм, я отримав цю помилку. я змінив

неявний оператор

до

явний оператор

це буде добре. Дякую


0

У моєму випадку версія dll, на яку посилався, була насправді новішою, ніж та, що була у мене раніше.

Мені просто потрібно було повернутися до попереднього випуску, і це виправило.


0

Для мене це було викликано проектом як прямо, так і опосередковано (через іншу залежність), що посилається на дві різні споруди Надувного замку, які мали різні назви збірок. Однією з збірок Bouncy Castle був пакет NuGet, іншою - налагоджувальна збірка джерела, завантаженого з GitHub. Обидва номінально мали версію 1.8.1, але в налаштуваннях проекту коду GitHub було встановлено ім'я збірки BouncyCastle, тоді як пакет NuGet мав збірку BouncyCastle.Crypto. Зміна налаштувань проекту, тим самим вирівнюючи імена збірок, вирішила проблему.


1
Я пропоную вам зробити свою відповідь більш корисною, також пояснивши, як ви її виправили.
Стівен Кеннеді

0

У мене схожа проблема, і я видалив RuntimeFrameworkVersion, і проблема була виправлена.

Спробуйте видалити 1.1.1 або


0

У мене виникла проблема з нещодавно створеним рішенням, яке використовувало існуючі проекти. З якихось причин один проект не міг "побачити" один інший проект, хоча він мав ту саму посилання, що і кожен інший проект, і проект, на який посилався, також будувався. Я підозрюю, що не вдалося виявити щось, пов’язане з кількома цільовими фреймворками, оскільки він будувався в одному фреймворку, але не в іншому.

Очищення та відновлення не працювали, а перезапуск VS не працював.

Нарешті, це спрацювало, відкривши "Командний рядок розробника для VS 2019", а потім видавши msbuild MySolution.slnкоманду. Це успішно завершено, а згодом VS також почав успішно будувати.


-3

Очистіть своє рішення та відновіть роботу, яка працювала для мене (у Visual Studio це параметри, які ви отримуєте, клацнувши правою кнопкою миші у своєму провіднику рішень), у моєму проекті помилки немає

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.