Сохраняющаяся зависимость от сборки в C # .NET

StackOverflow https://stackoverflow.com/questions/9173

  •  08-06-2019
  •  | 
  •  

Вопрос

Мой проект на C # - назовем его SuperUI - использовался для использования класса из внешней сборки.Теперь это не так, но компилятор не позволит мне создать проект без ссылки на сборку.Позвольте мне пояснить.

Этот проект использовался для создания и перехвата пользовательского класса исключений - the SuperException - который был получен из стандартной системы.Исключение и находился в отдельной, предварительно скомпилированной сборке, SuperAssembly.DLL, на который я ссылался.

В конце концов, я решил, что это бессмысленное упражнение, и заменил все SuperExceptions с системой.Подходящее стандартное исключение в каждом конкретном случае.Я удалил ссылку на SuperException.DLL, но теперь я столкнулся со следующим при попытке скомпилировать проект:

Тип 'SuperException' определен в сборке, на которую нет ссылки.Вы должны добавить ссылку на сборку 'SuperException, Version=1.1.0.0 (...)'

Исходный файл, на который ссылается ошибка, не кажется релевантным;это пространство имен project, которое выделяется в IDE.

Итак, вот в чем дело:

  1. Все виды использования SuperException были исключены из кода проекта.
  2. По сравнению с другим проектом, который отлично компилируется без ссылки на SuperException.DLL, я ссылаюсь только еще на одну сборку - и that не ссылается ни на что, на что не ссылается сам мой проект.Хотя вполне возможно, что любая из этих зависимостей может привести к SuperExceptions, я перехватываю только базовый класс исключений и ни в коем случае...другой проект строится нормально!
  3. Я много раз делал "Чистое решение" Visual Studio и очищал все вручную.

Включение этой ссылки - это не конец света, я просто не понимаю, зачем это еще нужно.Нрррргг.Любые указания приветствуются!

Это было полезно?

Решение

Вероятно, это транзитивная ссылка, где вызов метода некоторого типа возвращает экземпляр SuperException в штучной упаковке ("downcast"), напримерИсключение, но из проверки кода в транзитивно включенном коде, т.е.код из ваших вызовов внешнего метода, компилятор знает, что вам нужно иметь возможность иметь информацию об этом типе в какой-то момент.

Resharper подскажет вам, в каком случае вам нужно добавить ссылку, и вы могли бы использовать Lütz Roeder's aka redgate's Reflector для сканирования скомпилированного IL на предмет ссылки на этот тип двумя способами:1) используйте средство поиска, 2) откройте каждый общедоступный тип, который вы используете, и для того, для которого требуется сборка "ghost", он попросит вас указать его местоположение.

Чаще всего это происходит со мной, когда я ссылаюсь на Castle.Виндзор, но не Касл.Микроядро.:p

Другие советы

  1. Выйдите из Visual Studio
  2. Удалите папки bin и obj из каталога вашего решения
  3. Перезагрузитесь и посмотрите, что произойдет

Я согласен с другими комментариями здесь..Там есть ссылка обычным текстом где - то !У меня были подобные проблемы в прошлом, когда поиск по файлам проекта ничего не возвращал, оказывается, это было в каком-то другом файле, который не был автоматически выбран при поиске.

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

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

Редактировать:

Просто хочу добавить, что если местоположение, на которое указывает ошибка, кажется случайным, это часто может означать несоответствие между скомпилированным исходным кодом и файлом исходного кода..Является ли это приложением ASP.NET?У меня было это раньше, когда скомпилированные библиотеки DLL не были заменены при перестроении в папке ASP.NET temp, что приводило к сбоям..Интересно при отладке :)

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

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

Поскольку это ошибка компилятора, где-то в проекте должна быть ссылка или использование SuperException .

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

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

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

Предложение, которое я еще не пробовал, состоит в том, чтобы создать новый проект и добавить в него все свои материалы, мысль о которых действительно проверяет мою волю к жизни.;) Я могу попробовать это завтра, если меня потрудятся.Еще раз спасибо.

На самом деле в современных проектах VS нет ничего особенного - это все текстовые файлы и т.д.ЧТО-то должно ссылаться на этот класс / dll, и это что-то должно быть частью вашего проекта.

Вы действительно использовали grep или findstr для всего дерева решений, каждый отдельный файл, для ссылки на это исключение?

Это звучит довольно странно.Вот что я хотел бы проверить дальше:

  1. Убедитесь, что в вашем файле Properties /AssemblyInfo.cs ничего не задержалось.
  2. Убедитесь, что в вашем файле SuperUI.csproj ничего не сохранилось.
  3. Удалите все ссылки и добавьте их заново.

Попробуйте создать новый проект и добавить в него все свои классы.

создайте grep в папке вашего проекта.Это может быть скрытая ссылка в вашем проекте или проект, на который ссылается ваш проект.При необходимости очистите с помощью Блокнота.

Если вы ссылаетесь на какие-либо типы, наследуемые от SuperException (даже если тип определен в другой сборке), вам нужна ссылка на сборку, в которой определено SuperException.

Поддерживаю в этом вопросе.

Возможно, вы ссылаетесь не на это SuperException, но вы , возможно , ссылаетесь на SpecializedSuperException, который является производным от или каким-либо иным образом использует SuperException - ваш grep-код проекта для SuperException но я этого не поймаю.

Попробуйте взломать с помощью пробной версии NDepend

Именно здесь такие инструменты, как Перетачиватель действительно окупается - простой способ поиска обычно сообщает мне о таких "призрачных зависимостях" несколько раз.

Может быть, вы могли бы перейти к своему определению класса SuperException и попытаться найти все ссылки ().Возможно, вы также захотите выяснить, имеет ли исключение assembly SuperException циклическая зависимость от вашей основной сборки (например, основная сборка зависит от сборки исключения, зависит от основной сборки ...).

У меня была очень похожая проблема со ссылкой на сборку, которая возникала, когда в моей библиотеке C # была зависимая сборка C ++ / CLI.Проблема заключалась в том, что я наследовал открытый класс из этой сборки C ++ / CLI в моей библиотеке сборок C #.Это означало, что цепочка наследования охватывала несколько сборок.

Я надеялся, что любой клиент будет достаточно умен, чтобы косвенно загружать сборку C ++ / CLI в любое время, когда это понадобится библиотеке C #, но это было не так даже во время компиляции.

Я избавился от этой проблемы, нарушив наследование между классами, которые охватывали эти две библиотеки ассемблеров, и используя вместо этого агрегацию.Мой клиент, наконец, был счастлив и больше не требовал сборки C ++ / CLI в качестве зависимости.

В своем слове вы, вероятно, должны были бы убедиться, что SuitableStandardException не наследуется от SuperException для того, чтобы устранить SuperException.DLL в качестве ориентира.

Используйте инкапсуляцию вместо наследования и создайте SuperException элемент данных в вашем новом SuitableStandardException.

Если это не решит проблему, у вас может быть больше классов, охватывающих наследование в некоторых сборках, в вашем случае SuperAssembly.DLL и superException.dll.

Если вы не можете найти их все, попробуйте этот трюк:

  1. Сделайте всех ваших общедоступных участников и классы SuperAssembly.DLL внутренний.

  2. В SuperAssembly.DLL подружитесь с SuperException.DLL:

    [assembly:InternalsVisibleTo("SuperException, PublicKey=0024000004800000....)]
    
  3. Убедитесь, что они создают и удаляют SuperAssembly.DLL ссылка от любого клиента, который уже ссылается SuperException.DLL.

grep -R SuperException * в базе вашего проекта (получите grep откуда-то сначала) просто для уверенности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top