Visual studio удалить using
Подогреваемые жаждой сделать полезное коллегам, независимые разработчики решили написать небольшие расширения для Visual Studio. А тут еще и Extension Manager из Visual Studio 2010 так упростил процесс распространения расширений. Пример таких расширений можно найти здесь и здесь. Невозможно судить об алгоритмах, используемых в этих расширениях. Хотя не буду скрывать, что после того как первое расширение бессовестно удалило из проекта приличную часть реально нужных для компиляции сборок, мы все таки посмотрели его рефлектором… Разбираться со вторым уже не стали. В общем-то, проблема одинакова, а ключевое словосочетание можно найти в пред-предыдущем предложении: нужных для компиляции.
Рассмотрим простой пример. Пусть есть 3 проекта – 3 сборки. Сборка Assembly_A определяет класс Class_A, сборка Assembly_B определяет класс Class_B, унаследованный от класса Class_A из сборки Assembly_A. У каждого класса есть различные методы, скажем метод класса Class_A это Method_A, а метод класса Class_B – Method_B. В третьей сборке (Assembly_C) мы хотим использовать класс Class_B. Для этого в проекте добавляем ссылки на сборки Assembly_A и Assembly_B, после чего в каком-то из классов создаем экземпляр класса Class_B, вызываем метод Method_B и компилируем проект. Сборка Assembly_C готова, давайте откроем её с помощью ildasm.exe и взглянем на манифест:
// Metadata version: v4.0.30319
.assembly extern mscorlib
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
>
.assembly extern Assembly_B
.ver 1:0:0:0
>
.assembly Assembly_C
// метаданные для текущей сборки
>
.module Assembly_C.exe
// MVID:
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000003 // ILONLY 32BITREQUIRED
// Image base : 0x014C0000
* This source code was highlighted with Source Code Highlighter .
Это что же получается?! Assembly_A мы добавили к проекту, а она и не нужна? Открываем Visual Studio и удаляем из проекта Assembly_C ссылку на сборку Assembly_A. Компилируем и… получаем ошибку “The type 'Assembly_A.Class_A' is defined in an assembly that is not referenced. You must add a reference to assembly 'Assembly_A, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.”
Важно понимать причину такого поведения. В проекте нигде нет явного обращения к типам сборки Assembly_A, поэтому ссылка на эту сборку не включается в манифест сборки проекта (Assembly_C). В то же время один из типов сборки Assembly_B используется в проекте. Фактически, получается, что для времени выполнения (runtime) достаточно иметь ссылку на сборку Assembly_B. А сборки, от которых она зависит, CLR получит уже из её манифеста и так же загрузит. Но для компилятора (compile time) важно иметь в проекте Assembly_C ссылки и на сборку Assembly_B и на сборку Assembly_A, ведь он должен знать все об используемом классе Class_B, в том числе и её предков. Хорошая статья о зависимостях сборок была опубликована в MSDN Magazine, прочитать её можно здесь.
Не важно, где в вашем проекте используется класс: как поле какого-то класса, как параметр метода, как атрибут и т.п. Важно понимать то, что у компилятора должна быть возможность получить полную информацию обо всех типах, используемых в проекте. Мы должны четко указывать сборку, которую хотим использовать, ведь класс может существовать в разных версиях одной сборки (даже если компилятор сможет найти сборку (скажем в GAC), то, как ему выбрать нужную, если их несколько?). Вот, что должно быть основной идеей при разработке программы способной находить неиспользуемые в проекте сборки, т.е. такие сборки которые не требуются для компиляции.
Исследование зависимостей классов проекта служит основой расширения Reference Assistant, которое мы разработали в Lardite Group. Это бесплатное расширение доступное в Visual Studio Gallery, кроме того, вы можете загрузить исходный код Reference Assistant со страницы проекта на CodePlex.
Именно с анализа иерархии классов начался Reference Assistant. Постепенно к нему добавился анализ иерархии интерфейсов, анализ атрибутов и типов их параметров, анализ импортированных типов (например, из COM библиотеки), типов перемещенных в другую сборку. Да, есть и такие! Простой пример — ObservableCollection перекочевал из сборки WindowsBase.dll (fx3.5) в System.dll (fx4.0).
Мне нравится пример с анализом перегруженных методов. Предположим, в сборке Assembly_B определен класс Class_B, в котором метод SetCode перегружен. Пусть две его перегрузки принимают по одному параметру: один типа System.Int32, другой Assembly_A.Class_A. В сборке проекта (Assembly_C) вызывается один из перегруженных методов SetCode класса Class_B принимающий один параметр. В этом случае компилятор должен знать всё о типах параметров обоих методов, чтобы выбрать наиболее подходящий. А это значит, что сборки, в которых есть определения типов участвующих в иерархии, должны быть в ссылках проекта. Т.е. в нашем случае в ссылках проекта Assembly_C должна быть ссылка на сборки Assembly_A и Assembly_B. Описанный пример в виде кода:
// Assembly_B.dll
using Assembly_A;
namespace Assembly_B
public class Class_B
public void SetCode( int code)
// some actions…
>
public void SetCode(Class_A code)
// some actions…
>
>
>
// Assembly_C.dll (проект, который использует Assembly_B)
using Assembly_B;
namespace Assembly_C
public class Class_C
public void Run()
// some actions…
var classB = new Class_B();
classB.SetCode(1);
// some actions…
>
>
>
* This source code was highlighted with Source Code Highlighter .
Это самое основное, что хотелось рассказать. Конечно, во время разработки, мы столкнулись со множеством нюансов, описать которые в одной статье было бы перебором. Но о самых интересных мы непременно постараемся написать в других статьях. В заключении, хочется пару слов сказать об использовании Reference Assistant.
Как я уже говорил ранее, скачать Reference Assistant можно либо с CodePlex, либо с Visual Studio Gallery. Между ними есть небольшое различие – расширение, выложенное в Gallery, нельзя использовать в Express редакции Visual Studio (это ограничение Visual Studio Gallery), но расширение с CodePlex можно.
Самый простой способ установки — использовать Extension Manager, утилиту Visual Studio.
Для удаления неиспользуемых сборок в контекстном меню проекта или ссылок проекта (папка References) выбрать пункт “Remove Unused References”.
Перед удалением неиспользуемых сборок будет показано окно для подтверждения списка. Вы можете редактировать это список, если уверены, что сборка нужна по каким-либо причинам (например, динамически подключается к приложению в зависимости от настроек в файле конфигурации).
Можно так же отключить показ окна “Unused References List” с помощью опции “Don’t show this dialog next time”. Снова включить можно в конфигурации расширения: меню Tools -> Options… -> Reference Assistant.
In Visual Studio 2019 how can I remove unused usings on format document?
In VS2017 it is labelled "Experiment" which generally means it may not survive. (I usually just use Crtl-R,Ctrl-G which is mapped to the context menu comment to sort & remove usings).
8 Answers 8
In Visual Studio 2019 you can remove unused usings with the Code Cleanup command:
And running code cleanup also formats the document.
I'm with OP on this one - I really enjoyed having a single command to do both. It seems like the code cleanup should be configurable to also format the document. Given that code cleanup is already configurable, that seems like it would have hit both camps.
It didn't when I tried before but maybe I'd jacked something up. I'll give it another go. [edited to add] - it looks like the thing I was expecting it to do it just doesn't do generally, so that's on me.
CTRL + K + E Will sort and remove your unused usings.
First : go Extensions - > install "Productivity Power tools" then "Power Commands for Visual Studio" extentsion
Second : go tools menu -> Options -> Productivity Power tools -> PowerCommands -> General -> checked "Remove and Sort Usings on save"
note : These options are available only when you use "Power Commands for Visual Studio".
These options are available only when you use "Power Commands for Visual Studio". Please, mention this in your answer.
@KyryloM Thanks. I reformatted my computer and couldn't figure out why this had stopped working. I didn't realize this wasn't a part of Power Tools. So glad I saw your comment!
I am using VS 2022, I installed Productivity Power tools, but didn't find "Remove and Sort Usings on save" neither "Power Commands for Visual Studio"
The keyboard command that works for me is
Hi @SuitBoyApps, I tried to include a picture but StackOverflow wouldn't let me embed it due to not having enough reputation. The submission form even forced me to use and then replaced my embedded image with the link provided. So I'm at a bit of a chicken and egg problem here. I'm sure it's been a while since you were posting under an account that had no reputation so I'm sure you wouldn't have known this. I'll leave it as is, thanks.
I am using visual studio 2010 and was wondering if there is a way to automatically remove all the namespaces that aren't being used at the the top of the page e.g.
in the above example System.Collections.Generic is not being used is there a way to know that without trial and error.
@IvoTops: For stingy people like myself that haven't (yet) spent my money on ReSharper, its actually possible to do in VS2010 directly using macros. See the blog post in my answer below if you are interested (or stick to resharper that obviously does this without any hustle :)
@Avada Kedavra:I made it a comment because recommending products is not my favourite way of answering. But in this case I couldn't resist. And I do love ReSharper. Well worth the money, imho.
9 Answers 9
Yes you can right click on the page and from the menu select;
Alternatively if you prefer shortcuts, please use;
I am using this all the time, to clean up code, and make code compilation quicker.
Or you can use PowerCommands to remove unused usings for entire projects
How can I run this command on all the XAML files in a project ? Visual Studio and Resharper do remove unused references but not in XAML files which is a shame.
In Visual Studio 2017, I use this very simple key combinations: CTRL + R + G to remove unused imports/namespaces
Update:
Unfortunately, there's no default key binding for this but you can always edit your preferences.
In my case, it is binded as ⌘ + R + G
Good answer, for those wanting more it's firing the EditorContextMenus.CodeWindow.RemoveAndSort command.
You can install an extension called: Productivity Power Tools 2015 (from Microsoft) and it has an option to automatically remove unused usings when you save your file. No more work needed after.
Not sure if you are using ReSharper, but it can cause Power Commands to break in VS 2017. Try unchecking 'Hide overridden VS menu items' in ReSharper Options.
Great answer, thanks for the tip! You could improve your answer by showing how you can install extensions in Visual Studio. I found out how to do it now, but would be easier if you include this into your answer.
If you are using Visual Studio 2019, you can:
Right click your solution -> Analyze and Code Cleanup -> Configure Code Cleanup -> Create a profile (Remove & Sort usings) and then run it.
For VS 2019, VS 2022 or ReSharper. If you add an unused using to the top of a file such as using System.IO; a light bulb appears. Clicking on the light bulb gives the option to remove the unused usings from either the file, folder, project or entire solution.
Same answer as everyone else. If you are a keyboard ninja ( Shift + F10 pops up contextual menu), use this:
Shift + F10 , O , R
What do you call that special key for contextual menu? Instead of pressing Shift + F10 (my keyboard don't have that special key, that's why I uses Shift + F10 ), that is shorter:
whateverThatKeyCalled , O , R
I know the OP specified VS 2010, but that was a while ago and this feature is built right into VS 2017. From the Menu, Tools -> Options, then find the check box below.
After that, any time you use CTRL + K , CTRL + D they will be removed.
I am using Visual Studio 2019 and for some reason my project settings have a Warning level of 3 and this prevent Visual Studio from cleaning the usings. Make sure this value is set to 4.
As saj is saying you can use the Remove Unused Usings , which works great and even greater if you sort the usings at the same time. Resharper 4.5 can help you do this for entire projects which is a functionality that is missing (and is missed) in VS2010.
More info provided in the following thread: Remove unused Usings across entire assembly
Tip: The thread above refers to the blog that proposes a macro to remove unused usings across the entire solution. Organize Usings Across Your Entire Solution. I just tried it out, and it worked like a charm!
Списки завершения
члены типа или пространства имен;
имена переменных, команд и функций;
Ключевые слова языка
Фрагменты кода в списках завершения
Ключевые слова языка в списках завершения
Методы расширения в списках завершения
В списке завершения отображаются не все методы расширения для объектов String.
В методах расширения используется не такой значок, как в методах экземпляра. Справочник по значкам списка вы найдете в статье Значки представления классов и обозревателя объектов. Если метод экземпляра и метод расширения с одинаковыми именами находятся в одной области, в списке завершения отображается значок метода расширения.
Фильтрованные списки завершения
Атрибуты. При применении атрибута к типу список завершения фильтруется таким образом, что в нем остаются только типы, которые получены из пространств имен, содержащих эти типы, например Attribute.
Предложения CATCH.
Инициализаторы объектов. В списке завершения будут отображаться только те элементы, которые могут быть инициализированы.
Ключевое слово new. При вводе new и нажатии клавиши ПРОБЕЛ появляется список завершения. Элемент в списке выбирается автоматически в зависимости от контекста в коде. Например, в списке завершения автоматически выбираются элементы для объявлений и операторов возврата в методах.
Ключевое слово enum. При нажатии клавиши ПРОБЕЛ после ввода знака равенства для назначения перечисления появляется список завершения. Элемент в списке выбирается автоматически в зависимости от контекста в коде. Например, в списке завершения автоматически выбираются элементы после ввода ключевого слова "return" и при объявлении.
Операторы AS и IS. Фильтрованный список завершения отображается автоматически при нажатии клавиши ПРОБЕЛ после ввода ключевого слова as или is .
События. При вводе ключевого слова event список завершения содержит только типы делегатов.
Справочная система по параметрам автоматически сортируется по первой перегрузке метода, соответствующей параметрам, по мере их ввода. Если существует несколько перегрузок метода, можно использовать кнопки со стрелками вверх и вниз для перехода к следующей возможной перегрузке в списке.
Недавно использовавшиеся члены
IntelliSense запоминает последние элементы, выбранные во всплывающем окне Список членов для автоматического завершения имени объекта. Когда вы откроете список членов в следующий раз, сверху будут отображаться элементы, которые недавно использовались. Журнал наиболее часто используемых членов списка очищается после завершения каждого сеанса Visual Studio.
override
Если ввести override, а затем нажать клавишу ПРОБЕЛ, IntelliSense покажет во всплывающем списке все допустимые элементы базового класса, которые можно переопределить. Если после приглашения override ввести тип возвращаемого значения метода, IntelliSense отобразит только методы, возвращающие этот тип. Если IntelliSense не сможет найти совпадения, будут показаны все члены базового класса.
IntelliSense с возможностями искусственного интеллекта
Расширение Visual Studio IntelliCode предоставляет списки завершения IntelliSense с использованием искусственного интеллекта. IntelliCode предсказывает, какой API будет наиболее подходящим, а не просто возвращает список членов в алфавитном порядке. Оно формирует список динамически на основе текущего контекста вашего кода.
Автоматическое генерирование кода
Добавить директиву using
Операция IntelliSense Добавить директиву using автоматически добавляет требуемую директиву using в файл кода. Это позволяет сосредоточить внимание на коде, который вы пишете, и не отвлекаться на другую часть кода.
Чтобы инициировать операцию Добавить директиву using, поместите курсор на ссылку на тип, которую не удается разрешить. Например, при создании консольного приложения и добавлении XmlReader в тело метода Main в соответствующей строке появляется подчеркивание красной волнистой линией, так как ссылку на тип не удается разрешить. После этого можно вызвать операцию Добавить директиву using, выбрав быстрое действие. Быстрые действия отображаются, только если курсор находится в несвязанном типе.
Щелкните значок лампочки с ошибкой и выберите пункт using System.Xml;, чтобы автоматически добавить директиву using.
Добавлять отсутствующие директивы using при вставке
Удаление и сортировка директив using
Параметр Удалить и сортировать директивы using позволяет сортировать и удалять объявления using и extern , не меняя поведение исходного кода. Со временем исходные файлы могут стать перегруженными, и их станет трудно читать по причине ненужных и неорганизованных директив using . Параметр Удалить и сортировать директивы using сжимает исходный код, удаляя неиспользуемые директивы using и улучшая читаемость путем их сортировки. В меню Правка выберите IntelliSense, а затем Упорядочить директивы Using.
Реализация интерфейса
Технология IntelliSense может облегчить реализацию интерфейса при работе в редакторе кода. Обычно для правильной реализации интерфейса нужно создать объявление метода для каждого члена интерфейса в классе. При использовании IntelliSense после ввода имени интерфейса в объявлении класса появляется значок быстрых действий в виде лампочки. Он позволяет выбрать вариант автоматической реализации интерфейса с помощью явного или неявного именования. При явном именовании объявления метода содержат имя интерфейса. В случае неявного именования объявления метода не указывают, к какому интерфейсу они принадлежат. Доступ к явно именованному методу интерфейса может осуществляться только через экземпляр интерфейса, а не через экземпляр класса. Дополнительные сведения см. в разделе Явная реализация интерфейса.
Реализация интерфейса создает минимально необходимый для работы интерфейса набор заглушек методов. Если базовый класс уже реализует часть интерфейса, заглушки не восстанавливаются.
Реализация абстрактного базового класса
IntelliSense предоставляет возможность автоматической реализации членов абстрактного базового класса при работе в редакторе кода. В обычном режиме для реализации членов абстрактного базового класса для каждого метода абстрактного базового класса в производном классе необходимо создать новое определение метода. При использовании IntelliSense после ввода имени абстрактного базового класса в объявлении класса появляется значок быстрых действий в виде лампочки. Он дает возможность автоматической реализации методов базового класса.
Заглушки метода, создаваемые функцией Реализовать абстрактный базовый класс, моделируются фрагментом кода, определенным в файле MethodStub.snippet. Фрагменты кода можно изменять. Подробнее см. в разделе Пошаговое руководство. Создание фрагмента кода.
Создание в результате использования
Возможность Создание в результате использования позволяет использовать классы и элементы до того, как они будут определены. Для любого класса, конструктора, метода, свойства, поля или перечисления, которое вы хотите использовать, но еще не определили, можно создать заглушку. Новые типы и члены можно создавать, не покидая текущего расположения в коде. Это сводит до минимума нарушения в рабочем процессе.
Щелкните неопределенный идентификатор. Под идентификатором появляется значок быстрых действий в виде лампочки с ошибкой. Щелкните лампочку с ошибкой.
Щелкните неопределенный идентификатор и нажмите клавиши CTRL+ . (CTRL+точка).
Щелкните неопределенный идентификатор правой кнопкой мыши и выберите пункт Быстрые действия и рефакторинг.
В число появившихся параметров могут входить следующие:
Сформировать свойство
Сформировать поле
Создание метода
Сформировать класс
Сформировать новый тип (для класса, структуры, интерфейса или перечисления)
Сформировать обработчики событий
В редакторе кода IntelliSense упрощает подключение методов (обработчиков событий) к полям событий.
Если ввести оператор += после поля события в файле CS, IntelliSense предложит нажать клавишу TAB. В результате будет вставлен новый экземпляр делегата, который указывает на метод, обрабатывающий событие.
При нажатии клавиши TAB IntelliSense автоматически завершает оператор и отображает ссылку на обработчик событий в виде выделенного текста в редакторе кода. Для завершения автоматического подключения события IntelliSense предлагает снова нажать клавишу TAB или создать пустую заглушку для обработчика событий.
Если новый делегат, созданный IntelliSense, ссылается на существующий обработчик событий, IntelliSense выводит эти сведения во всплывающей подсказке. Эту ссылку можно изменить — соответствующий текст уже выделен в редакторе кода. В противном случае автоматическое подключение события завершается на этом этапе.
При нажатии клавиши TAB IntelliSense заглушает метод с корректной сигнатурой и размещает указатель в теле обработчика событий.
История такая: была установлена VS 13 community, после снес ее, хотел посмотреть на visual studio 2015 ctp 6. Установил, при установке было несколько ошибок, не критичных. Интернеты говорят такая проблема не у меня одного была, ее решения было описано. Поигрался с ней, удалил. Решил заново вернуть VS 13 community, при установке сразу вылезла ошибка, необходимо сначало удалить VS 13 pro, но как так, оно же не устанавливалось вообще. Установил ртиалку VS 13 pro, установка прошла нормально без каких либо ошибок. Снес ее, как и просил инсталятор VS 13 community, ошибка никуда не делась, опять просит удалить сначало VS 13 pro. Все сопутствующие компоненты тоже были удалены во всех случаях. Пробовал чистить реестр как софтом так и вручную, удалил ключи которые нашел софт и я сам, искал по visual studio professional 2013. Гугление не дало ответа на вопрос. Может кто сталкивался? Прошу помочь.
- Вопрос задан более трёх лет назад
- 13224 просмотра
Решал аналогичную проблему при переходе с 2012 с помощью точек восстановления, потом снимками реестра.
Сейчас снимков нет и проблема в следующем:
Она смотрит в реестр и видит зависимости, поэтому не ставится. Пока ищу решение.
Если у Вас есть соображения на эту тему, поделитесь пожалуйста.
Никита Федотов: Та же ситуация. Была установлена VS 2015 Community она дала сбой, спустя неделю. Ошибки которые описаны в инете (уже не помню) Решил поставит VS 2012 любимую родную. Всё было ок, а через 2 недели вдруг это (The application was unable to start correctly 0xc0000142). Путался делать Recovery - не помогло. Сносил ставил заного - не помогло. Реестры чистил (коряво это было, ну как смог). Также ищу, может кто знает ещё что сделать.
Читайте также: