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

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

Я знаю, что сообщение об ошибке является обычным явлением, и есть много вопросов о 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(что я знаю), я не знаю, на какой сборке упоминается сообщение об ошибке.

4b9b3361

Ответ 1

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

MyObjectType a = new MyObjectType("parameter");

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

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

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

Надеюсь, это по крайней мере заставит вас идти в правильном направлении!

Ответ 2

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

В моем случае "Вы должны добавить ссылку на сборку" на самом деле означало, что у вызывающих и ссылочных проектов не была та же целевая структура. Проект вызывающего абонента имел .Net 4.5, но ссылка на библиотеку имела цель 4.6.1.

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

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

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

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

Ответ 9

В моем случае ничего из этого не было. Оказалось, что версия ссылки dll на самом деле была более новой, чем версия, которую я имел раньше.

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

Ответ 10

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

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

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

Ответ 11

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

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

между BLL и DAL classes.when я хочу использовать BLL Layer In Application Layer, я получил эту ошибку. Я изменил

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

to

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

все в порядке. Благодаря

Ответ 12

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

Ответ 13

Очистите свое решение и перестроить работу для меня (в Visual Studio это параметры, которые вы получаете, когда вы щелкаете правой кнопкой мыши в своем браузере решений), ошибка ушла в мой проект.