it-roy-ru.com

Тип определяется в сборке, на которую нет ссылок, как найти причину?

Я знаю, что сообщение об ошибке встречается часто, и на 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 задано действие сборки "Compile". Они делают . Я также дважды проверил, что файл .cs, содержащий тип "Project.Rights.OperationsProvider", развернут в каталоге App_Code.

По какой-то причине приложение не ищет тип в каталоге App_Code. Поскольку я удалил все экземпляры Project.Rights.dll (о которых я знаю), я не знаю, в какой сборке упоминается сообщение об ошибке.

60
afaf12

Когда вы получаете эту ошибку, не всегда очевидно, что происходит, но, как говорится в ошибке - вы упускаете ссылку. Возьмем следующую строку кода в качестве примера:

MyObjectType a = new MyObjectType("parameter");

Это выглядит достаточно просто, и вы, вероятно, ссылались на «MyObjectType» правильно. Но допустим, что одна из перегрузок для конструктора «MyObjectType» принимает тип, на который вы не ссылались. Например, существует перегрузка, определяемая как:

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

Это как минимум один случай, когда вы получите эту ошибку. Итак, ищите этот тип шаблона, где вы указали тип, но не все типы свойств или параметров метода, которые возможны для функций, вызываемых для этого типа.

Надеюсь, это поможет вам двигаться в правильном направлении!

75
drew_w

Проверьте целевые рамки в проектах.

В моем случае «Вы должны добавить ссылку на сборку» фактически означало, что у вызывающих и ссылочных проектов не было одинаковой целевой структуры. У проекта вызывающей стороны был .Net 4.5, но у библиотеки, на которую есть ссылка, была цель 4.6.1. 

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

36
Michael Freidgeim

В моем случае это произошло потому, что обновление пакета NuGet содержало только обновленные ссылки на зависимости dll в some, но не во всех проектах в моем решении, что приводило к конфликту версий. Используя инструмент в стиле grep для поиска текста в файлах * .csproj в моем решении, было легко увидеть проекты, которые еще нужно обновить.

13
rogersillito

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

Удаление Project.Rights.dll противоположно тому, что вы хотите. Вы должны убедиться, что ваш проект может ссылаться на Ассамблею. Поэтому он должен быть либо помещен в глобальный кэш сборок, либо в каталог ~/Bin вашего веб-приложения.

Редактировать - если вы не хотите использовать сборку, то удаление ее также не является правильным решением. Вместо этого вы должны удалить все ссылки на него в своем коде. Так как сборка не нужна напрямую написанному вами коду, а вместо этого ссылается на что-то еще, вам придется заменить эту сборку на что-то, что не имеет Project.Rights.dll в качестве зависимости.

7
mason

Со мной просто случилось, что разные проекты ссылались на разные копии одной и той же библиотеки DLL. Я убедился, что все ссылались на один и тот же файл на диске, и ошибка исчезла, как я и ожидал.

3
Gonzalo Méndez

В моем случае я ссылался на библиотеку, которая создавалась с неверной платформой/конфигурацией (я только что создал указанную библиотеку).

Кроме того, мне не удалось исправить проблему в 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

Я надеюсь, что это помогает кому-то.

3
Joseph

Это не сработало для меня, когда я попытался добавить ссылку на вкладке .NET Assemblies . Это сработало, когда я добавил ссылку с BROWSE в C:\Windows\Microsoft. NET\Framework\v4.0.30319

1
Cătălin Rădoi

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

Начальное состояние:
Исходный путь к файлу: /Folder1/Subfolder1/MyWebForm.aspx.cs
Исходное имя класса кодового файла:Folder1_Subfolder1_MyWebForm

После того, как файл был перемещен:
Путь к файлу: /Folder1/MyWebForm.aspx.cs
Имя класса Codefile (без изменений, с отображаемой ошибкой):Folder1_Subfolder1_MyWebForm

Решение:
Переименовать Ваш класс кодового файла Folder1_Subfolder1_MyWebForm
к one соответствующему с новому пути : Folder1_MyWebForm

Все сразу - проблема решена, сообщений об ошибках нет.

0
Vladimír Hála

Для меня это было вызвано тем, что проект как прямо, так и косвенно (через другую зависимость) ссылался на две разные сборки Bouncy Castle, которые имели разные имена сборок. Одной из сборок Bouncy Castle был пакет NuGet, другой - отладочная сборка исходного кода, загруженного с GitHub. Оба они были номинально версии 1.8.1, но настройки проекта кода GitHub устанавливали имя сборки на BouncyCastle, тогда как пакет NuGet имел имя сборки BouncyCastle.Crypto. Изменение настроек проекта, таким образом выравнивая имена сборок, устранило проблему. 

0
mathiash

В моем случае это было потому, что я использовал 

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

между классами BLL и DAL. Когда я хочу использовать слой BLL На уровне приложений я получил эту ошибку . Я изменил 

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

в 

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

все будет хорошо . спасибо

0
Amirhossein Yari

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

Попробуйте удалить 1.1.1 или

0
Arash

В моем случае версия dll, на которую ссылаются, была фактически более новой, чем та, которую я имел прежде. 

Мне просто нужно было вернуться к предыдущему выпуску, и это исправило его. 

0
Hugo Nava Kopp

Это также может означать, что вы используете библиотеку, которая предоставляет (публичные) типы, которые определены в библиотеке. Даже если вы не используете их специально в своей библиотеке (тот, который не строит).

Вероятно, это мешает вам писать код, который использует класс (который в своей подписи имеет типы из библиотеки, на которые нет ссылок), которые вы не можете использовать.

0
cr4ne

Возможно, используемая вами библиотека (DLL-файл) требует другой библиотеки. В моем случае я ссылался на библиотеку, которая содержала модель сущности базы данных, но я забыл сослаться на библиотеку инфраструктуры сущностей.

0
Graham Laight

Тип 'Domain.tblUser' определен в сборке, которая не является ссылки. Вы должны добавить ссылку на Assembly 'Domain, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null '.

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

Примечание: убедитесь, что ваши ссылки верны в соответствии с вашим контейнером DI

0
Asif Raza

одной из основных причин может быть свойство DLL Вы должны прежде чем что-либо делать, чтобы проверитьspecific version property, если оно истинно, сделать его ложным 

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

0
Mohammed Rashed Ali