Ошибка отладки «Тип« xx »определен в сборке, на которую нет ссылок» - PullRequest
21 голосов
/ 13 ноября 2009

Полная ошибка выглядит следующим образом:

тип 'System.Windows.Forms.Control' является определяется в сборке, которая не ссылки. Вы должны добавить ссылку сборке 'System.Windows.Forms, Версия = 2.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089.

и указывает на самый первый оператор (строка Debug.Assert) в самом первом классе библиотечного проекта, который не нуждается в System.Windows.Forms (или так я думал). Я знаю, как это решить: добавить упомянутую ссылку. Но как мне узнать, какая библиотека вызывает эту ошибку или, что лучше, какая часть кода запускается с помощью библиотеки WinForms?

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


РЕДАКТИРОВАТЬ: Альтернативное решение

Эту или подобные проблемы также можно решить с помощью Binding Log Viewer Fuslogvw.exe от Microsoft Framework Tools. Он показывает все попытки и успехи сборок, к которым привязано ваше приложение.

Ответы [ 3 ]

30 голосов
/ 13 ноября 2009

Я подозреваю, что нет никакой строки в вашем коде, которая вызывает это, поскольку вы говорите, что не используете типы System.Windows.Forms, и ошибка компилятора не указывает на (полезную) строку вашего кода.

Я думаю, что происходит то, что вы ссылаетесь на библиотеку, которая имеет публично видимый метод или свойство, которое либо возвращает System.Windows.Forms.Control, либо принимает его в качестве параметра. Не имеет значения, действительно ли вы в итоге вызываете этот метод / свойство, тот факт, что он является публично видимым, означает, что ваш собственный код должен иметь возможность разрешать все типы, которые использует библиотека. Если бы библиотека использовала только System.Windows.Forms для внутреннего использования , этого не произошло бы.

Это также означает, что просто просмотр зависимостей сборок, от которых вы зависите, может просто сузить список подозреваемых, поскольку могут быть некоторые сборки, которые зависят от System.Windows.Forms внутри (без проблем) и проблемная сборка с открытым параметром / возвращаемым значением типа из сборки SWForms.

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

3 голосов
/ 13 августа 2014

У меня была такая же ошибка.

Проблема заключалась в том, что я использовал ссылку на проект, который использует System.Windows.Forms внутри.

Решение заключается в добавлении ссылки на System.Windows.Forms также в вашем проекте.

2 голосов
/ 13 ноября 2009

Используйте что-то вроде NDepend или Reflector или Object Browser для проверки зависимостей сборок, от которых вы зависите.

Я не могу придумать другого пути, учитывая информацию выше.

...