После того, как вы сделали собственные визуальные компоненты, я думаю, вы захотите их использовать в различных проектах, а впоследствии и поделится с миром наработками. Как их установить на панель инструментов в студии, как добавить эту библиотеку в “Add reference…” диалог и как избежать подводных камней в этом деле - все это будет описано в этой статье.
Подготовка сборки (assembly)
Когда у вас есть проект с настроенными компонентами и вы чувствуете что они выглядят и работают точно так как вам хочется - вы, возможно, захотите автоматизировать процесс установки. Для этого потребуется:
- Подписать сборку;
- Установить сборку в GAC;
- Добавить в “Add reference…” диалог;
- Добавить в панель инструментов студии.
Далее я расскажу как автоматизировать почти все пункты из этого списка, в небольших примерах. Для дальнейшего повествования буду исходить их предположения, что библиотека с компонентами зовется myCustomControl.dll.
Вообще, подписать сборку более чем легко. Вызываете контекстное меню для проекта, выбираете пункт Properties. Далее выбираем закладку Signing. Ставим галочку напротив “Sign the assembly” и выпадающий список будет доступен для редактирования.
Выбираем пункт “”, заполняем поля в появившемся окне и жмем OK. Пересобираем приложение. Вот и все. Только что создали подпись (strong key) для сборки.
Следующим шагом будет…
Читать далее на
Violet Tape без делений на части или здесь мелкими частями, потому что ЖЖ ниасилил столько кода для подсветки за раз
Добавление в GAC
Думаю, что более подходящим способом будет использование утилиты gacutil.exe. Ее можно вызвать из Visual Studio Command Prompt следующим образом:
gacutil /i “c:\my controls\myCustomControl.dll”
Незабываем, что путь надо писать в кавычках, если он содержит пробелы. Эта операция добавит сборку в GAC. В нашем случае, в программе я использую ключ /if (install force) для того, чтобы переписать сборку, если она уже есть. Код ниже, автоматизирует вызов утилиты:
Gacutil распространяется с .NET SDK. Для версии 3.5 путь C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\gacutil.exe; 4.0 - C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe. Принимая во внимание только что сказанное:
copy to clipboardподсветка кода- public class InstallToGac {
- public void Install(string fullAssemblyLocation) {
- var net35 = @"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\gacutil.exe";
- var net40 = @"C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe";
- var value = File.Exists(net35)
- ? net35
- : File.Exists(net40)
- ? net40
- : "";
- if (value == "") return;
- var process = new Process();
-
- process.StartInfo.FileName = value;
- process.StartInfo.Arguments = string.Format("/if \"{0}\"", fullAssemblyLocation);
- process.StartInfo.CreateNoWindow = true;
- process.Start();
- process.WaitForExit();
- }
- }
В процессе выполнения может мелькнуть окно консоли и все. Сборка в GAC. Для того, чтобы удалить вашу библиотеку из GAC, надо выполнить команду с ключом “/u” и добавить “f” если надо эту операцию сделать принудительно.
Добавление в диалог “Add reference…” в Visual Studio
Большинство моих коллег думают, что достаточно добавить библиотеку в GAC, как она тут же появится в вышеозначенном окне. К сожалению это не так, добавление в GAC это лишь один из шагов. Необходимо добавить еще ключ в реестре.
Цель:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders.
По этому пути надо создать ключ с точно таким же именем, как и библиотека, но без dll. После всех действий должно получится как на картинке:
Теперь, как это провернуть с помощью кода:
copy to clipboardподсветка кода- public class InstallToRefLibrary {
- public void Install(string assemblyLocation, string dllName) {
- var libRegPath = @"SOFTWARE\Microsoft\.NETFramework\AssemblyFolders";
- libRegPath = string.Format("{0}\\{1}", libRegPath, dllName);
-
- var registryKey = Registry.LocalMachine.OpenSubKey(libRegPath, true) ??
- Registry.LocalMachine.CreateSubKey(libRegPath);
-
- registryKey.SetValue("", assemblyLocation);
- registryKey.Close();
- }
- }
Для удаления - просто сотрите ключ из реестра.
Добавление в панель инструментов Visual Studio
Самые странные и уму непостижимые вещи начинаются здесь. Большинство из них из-за COM прошлого студии, некоторые появляются без вообще какого бы то ни было логического объяснения. Ну ладно, начнем с дурацких ограничений, которые могут всплыть.
- Если у вас стоит AnkhSVN, то это может привести к СОМ ошибкам. Я пробовал создавать закладки для панели инструментов на Win7 (7100) и получал ошибку, пока не снес этот плагин для студии. Под ХР все работает отлично даже с AnkhSVN. Описанную проблему можно найти на форуме Infragistics - у них та же проблема с AnkhSVN; и на собственном форуме этого плагина, но без описания почему это происходит и есть ли какое-нибудь лекарство. Так что помните об этом.
- Новая закладка с компонентами может быть установлена только тогда, когда WinForm проект существует в текущем открытом солюшене. Иначе только пустая закладка появится. К счастью, это легко обходится программным путем и я покажу как это сделать.
Перед началом написания кода необходимо добавить проектные ссылки на:
- EnvDTE;
- EnvDTE80;
- EnvDTE90.
От винта!
Установка при запущенной студии
В целом, при запущенной студии, достаточно легко работать. Для этого случая я буду предполагать, что солюшен с WinForm проектом все же существует и загружен. Ну или зачем тогда устанавливать визуальные компоненты? ;)
Первым делом надо определиться с тем, что мы будем устанавливать в новую панель, и новую панель тоже надо как-то идентифицировать. Для этой задачи создадим класс-помощник VSControl. Этот класс будет содержать информацию об имени новой панели, пути к сборке, типе компонента. Так же нам потребуется 2 конструктора: один для панели,
copy to clipboardподсветка кода- public VSControl(string tabGroupName) {
- Control = null;
- AssemblyPath = "";
- TabName = tabGroupName;
- IsToolBoxTab = true;
- }
и второй для элементов на нем. Выглядит сложновато, но конечная цель - более легкий код в дальнейшем. Я думаю что тут можно избавиться от assemblyPath и использовать взамен assembly.Location.
copy to clipboardподсветка кода- public VSControl(Assembly assembly, string assemblyPath, string typeName, string tabName) {
- var fullname = assembly.FullName.Split(new[] { ',' })[0];
- Control = assembly.GetType(fullname + "." + typeName);
- AssemblyPath = assemblyPath;
- TabName = tabName;
- IsToolBoxTab = false;
- }
Следующие действия:
- Получить ссылку на VS;
- Получить ссылку на панель инструментов;
- Создать новую панель;
- Создать набор компонентов.
Все эти действия, на мой взгляд, лучше всего собрать под крышей одного класса DevEnvironment. Этот класс будет иметь только один публичный метод, к примеру, RegisterControls, который будет принимать в качестве параметров массив компонентов и номер версии студии.
copy to clipboardподсветка кода- public class DevEnvironment {
- public static bool RegisterControls(string dteVersion, params VSControl[] controls) { … }
- }
В деталях это все будет:
Читать полностью
Violet Tape или
часть II