Visual Studio как установить сборку

Обновлено: 24.11.2024

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

По умолчанию при установке набора инструментов Ultimate UI for Windows Forms управляющие сборки устанавливаются в GAC. Если вы хотите развернуть компоненты Infragistics, которые являются частью вашего приложения, в GAC клиентского компьютера, есть два основных метода.

Использование Gacutil.exe для добавления компонентов в GAC

Чтобы использовать инструмент Gacutil.exe:

Откройте командную строку Visual Studio

Введите команду Gacutil.exe. В следующей строке показано добавление компонента Infragistics WinChart в GAC из папки приложения с именем MyApplication.

gacutil -i C:\Projects\MyApplication\Infragistics.Win.UltraWinChart.v21.2.dll

Командная строка Gacutil.exe включает ряд команд, позволяющих указать операцию, которую должен выполнять инструмент. В приведенном ниже списке объясняются доступные команды:

/i — устанавливает сборку в GAC

/il — устанавливает одну или несколько сборок в GAC

/u — удаляет сборку из GAC

/ul — удаляет одну или несколько сборок из GAC

/ungen — удаляет собственные образы, установленные с помощью утилиты NGEN

/l — список GAC, отфильтрованных по

/lr — список GAC со всеми отслеживаемыми ссылками

/cdl — удаляет содержимое кеша загрузки

/ldl — список содержимого кеша загрузки

Gacutil.exe также позволяет указать несколько параметров в командной строке:

/r — указывает отслеживаемую ссылку для установки или удаления

/f — принудительная переустановка сборки

/nlogo — подавляет отображение баннера с логотипом

/silent — отключить отображение всего вывода

Использование расширения Windows Explorer GAC для добавления компонентов в GAC

Используя это представление, вы можете добавлять сборки в GAC, просто перетаскивая их в папку ASSEMBLY. Вы также можете удалить файлы из GAC, выбрав опцию «Удалить» в меню «Файл» или в контекстном меню. Кроме того, как вы можете видеть на изображении выше, с помощью GAC вы можете установить несколько версий одной и той же сборки на одну и ту же машину. Каждое приложение, которое ссылается на сборку, выберет соответствующую версию на основе внутренних метаданных.

Дополнительная информация о глобальном кэше сборок

Дополнительную информацию об использовании GAC и установке приложений в GAC см. в следующих ресурсах:

Обзор

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

Требования

Глобальный кэш сборок

Чтобы создать небольшой проект библиотеки классов с помощью Visual Studio, сгенерировать строгое имя и установить DLL-файл проекта в GAC, выполните следующие действия:

В Visual Studio можно использовать свойства проекта IDE для создания пары ключей и подписи сборки. Затем вы можете пропустить шаг 3 и шаг 4, а также пропустить любые изменения кода в файле AssemblyInfo.cs.

Чтобы использовать свойства проекта IDE для создания пары ключей и подписи сборки, выполните следующие действия:

В обозревателе решений щелкните правой кнопкой мыши GACDemo и выберите "Свойства".

Перейдите на вкладку "Подписание" и установите флажок "Подписать сборку".

В списке Выберите ключ строгого имени нажмите .

Введите GACkey.snk в качестве имени файла ключа, снимите флажок Защитить файл ключа паролем и нажмите OK.

Нажмите сочетание клавиш CTRL+SHIFT+B, чтобы скомпилировать проект.

После того, как вы выполните эти шаги, вам все равно придется выполнить шаг 5, чтобы установить сборку в GAC.

Создайте каталог с именем GACKey в C:\, чтобы можно было легко найти ключ и получить к нему доступ из командной строки.

Введите следующую команду:

Скомпилируйте проект, нажав CTRL+SHIFT+B. Вам не нужно иметь никакого дополнительного кода для установки DLL-файла в GAC.

Вы можете установить файл .dll с помощью инструмента Gacutil или перетащив файл .dll в соответствующую папку. Если вы используете инструмент Gacutil, вы можете использовать команду, похожую на следующую:

Чтобы перетащить файл, откройте два экземпляра проводника Windows.В одном случае найдите расположение выходного файла .dll для вашего консольного проекта. В другом случае найдите c:\\Assembly. Затем перетащите DLL-файл в папку Assembly.

Сборки для настраиваемого действия рабочего процесса должны быть установлены в глобальный кэш сборок (GAC) сервера для фермы SharePoint 2013.

Примечание: "> Примечание. Сборки для настраиваемого действия рабочего процесса должны иметь строгие имена. Перед компиляцией сборок убедитесь, что вы создали файл ключей со строгим именем и подписали каждую сборку, включенную в настраиваемое действие рабочего процесса. Для Дополнительные сведения о подписании сборок см. в разделе Создание и использование сборок со строгими именами.

Существует два рекомендуемых варианта ручной установки сборок и связанных файлов для пользовательского действия рабочего процесса в GAC:

Вы можете создать пакет установщика Windows в Visual Studio для пользовательского действия рабочего процесса, чтобы установить сборки для пользовательского действия рабочего процесса в GAC.

Совет: "> Совет. Используйте этот параметр для целей тестирования или производства. Этот вариант рекомендуется для установки сборок в производственные установки.

Дополнительные сведения о создании пакета установщика Windows в Visual Studio см. в разделе Развертывание установщика Windows.

Инструмент глобального кэша сборок

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

Внимание: "> Внимание! Используйте этот параметр только для целей тестирования. Этот вариант не рекомендуется для установки сборок в производственные установки.

Чтобы установить сборку в GAC из командной строки

Запустите командную строку от имени администратора.

В командной строке выполните следующую команду, заменив ее полным путем и именем файла сборки:

Дополнительную информацию об использовании инструмента глобального кэша сборок см. в разделе Практическое руководство. Установка сборки в глобальный кэш сборок.

Рекомендации

Использование списка сборок для установки нескольких сборок

Вместо использования параметра /i с инструментом глобального кэша сборок для установки только одной сборки и многократного вызова инструмента для установки сборок для настраиваемого действия рабочего процесса вы можете использовать файл списка сборок и параметр /il для установки нескольких сборок за один вызов инструмента. Файл списка сборок представляет собой текстовый файл ANSI, который для установки содержит относительные пути и имена файлов устанавливаемых сборок. Объявленный путь каждой сборки в файле должен относиться к местоположению файла списка сборок.

Вручную переместить файлы базы данных программы (.pdb) в GAC

После установки сборок в GAC вы можете вручную переместить файлы базы данных программы в GAC для удаленной отладки. Если сборки скомпилированы в режиме отладки и соответствующие файлы базы данных программы перемещены в GAC, вы можете затем подключить удаленный отладчик Visual Studio к рабочему процессу Internet Information Services (IIS), w3wp.exe, для устранения неполадок или тестирования сборок. для пользовательского действия рабочего процесса, когда это действие используется в рабочем процессе Nintex.

Чтобы переместить файл базы данных программы в GAC

Запустите командную строку от имени администратора.

В командной строке выполните следующую команду:

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

Я собирал информацию из многих источников и делал много проб и ошибок.

Примеры проектов (для справки)

Примеры проектов MASM (как для 64-разрядной сборки, так и для 32-разрядной сборки) можно загрузить по ссылкам на Github ниже:

В этих примерах я также демонстрирую, как вызывать Win32 API "MessageBox" из кода сборки.

1. Установка Visual Studio 2019

При появлении запроса на выбор установленного языка я выбираю C++. Я не уверен, будет ли работать выбор других языков для проекта сборки.

2. Создание проекта C++ в качестве базового проекта

Создайте пустой проект C++.

Название проекта: «MASM». Так что на более позднем этапе мы можем сохранить этот проект в качестве шаблона проекта для дальнейшего использования.Установите место сохранения в любую предпочтительную папку (я заранее создал папку C:\VSProj). Выберите «Поместить решение и проект в один каталог», чтобы предотвратить создание двух вложенных папок с одинаковыми именами.

Visual Studio автоматически создаст папку с тем же именем проекта.

3. Настройте настройку сборки как язык ассемблера

Щелкните правой кнопкой мыши имя проекта > Зависимости сборки > Настройки сборки…

Выберите «masm», затем «ОК».

Щелкните правой кнопкой мыши имя проекта > свойства > компоновщик > система > подсистема : Windows
Это предотвратит отображение программой сборки окна консоли (черное окно в текстовом режиме). Или, если вам нужно окно консоли, вы можете оставить его по умолчанию: режим консоли.

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

4. Создание исходного файла сборки

Щелкните правой кнопкой мыши имя проекта > Добавить > Новый элемент…

Назовите файл: «Main.asm». Выбранный тип элемента значения не имеет. Можно выбрать любой тип. Но важно назвать его с расширением «.asm».

Напишите тестовую программу. Вы можете скопировать код снизу. Я адаптировал код из замечательной книги «Язык ассемблера для процессоров x86» Кипа Ирвина. Я настоятельно рекомендую эту книгу всем, кто начинает изучать язык ассемблера.

Во-первых, мы создадим 32-битный ассемблерный код. А затем в приложении B мы создадим 64-битный ассемблерный код.

32-битный ассемблерный код:

Чтобы создать 32-разрядную сборку, убедитесь, что в раскрывающемся списке "платформа решений" на панели инструментов выбран вариант "x86".

Нажмите зеленую кнопку воспроизведения: (запустить с помощью) локального отладчика Windows.
Программа суммирует 7 с 8 и возвращает результат 15, как показано в окне вывода отладки.

5. (Необязательно) Файл со списком настроек

Файл листинга полезен для изучения того, что сгенерировал ассемблер. Чтобы настроить создание файла листинга, щелкните правой кнопкой мыши имя проекта > Свойства > Microsoft Macro Assembler > Файл листинга > Файл листинга ассемблированного кода: $(IntDir)$(ProjectName).lst

Примечание. Страница «Microsoft Macro Assembler» появится только в том случае, если в проекте есть файлы сборки.

Соберите (и/или запустите) проект еще раз. Вы увидите файл листинга, сгенерированный в папке отладки проекта.

Перетащите файл со списком в Visual Studio, чтобы просмотреть его. Содержимое файла листинга будет таким:

6. (Необязательно) Настройка для сборки в режиме выпуска

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

В Visual Studio существует отдельная конфигурация сборки режима выпуска. Конфигурация режима выпуска может отличаться от конфигурации режима отладки. Например, режим выпуска может иметь больше возможностей оптимизации и меньше функций отладки.

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

6.1 Подсистема настройки (Windows или консоль) и создание файла листинга

Перейдите к свойствам проекта > измените режим конфигурации на : Release.

Выбор предпочтительной подсистемы (Windows или консоль).

Настройка создания файла листинга.

Изменение активной конфигурации на Release.

Попробуйте собрать и запустить программу, нажав зеленую кнопку воспроизведения. Вы увидите сообщение об ошибке: «Неустранимая ошибка: LNK1281: невозможно создать образ SAFESH».
Следующий шаг 5.2 устранит эту ошибку.

6.2 Полностью включить или отключить безопасные обработчики исключений

В режиме выпуска сборки параметр компоновщика по умолчанию заключается в том, что все изображения (объектные файлы) должны иметь безопасные обработчики исключений. Однако по умолчанию ассемблер (компилятор) не использует безопасные обработчики исключений. Эти конфликты вызывают указанную выше ошибку. Теперь у нас есть два варианта исправления ошибки.

Способ 1. Включите безопасные обработчики исключений в ассемблере (компиляторе).

Вариант 2. Или мы можем полностью отключить использование безопасного обработчика исключений в компоновщике.
Компоновщик > Расширение > Изображение имеет безопасные обработчики исключений : Нет

Выберите один способ, но не оба!

Я предпочел первый способ, потому что безопасные обработчики исключений выглядят безопаснее. Но на самом деле я не уверен на 100%, потому что у меня мало знаний о безопасных обработчиках исключений.

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

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

7. Сохранить как шаблон проекта

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

Сначала отредактируйте файл Main.asm, чтобы он содержал только код шаблона:

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

Нажмите: Проект > Экспорт шаблона…

Выберите наш проект «MASM» из выпадающего списка.

Опишите описание шаблона.

После этого при создании нового проекта можно было выбрать MASM в качестве шаблона проекта.

Приложение A: Отладка

Отладка в Visual Studio проста. Чтобы установить точку останова, достаточно щелкнуть серую область перед строкой исходного кода. При запуске программа будет приостанавливаться перед выполнением строки точки останова.

Чтобы просмотреть регистры, выберите Отладка > Windows > Регистры

Чтобы просмотреть переменные, выберите Отладка > Windows > Контроль. Затем введите имя переменной.
Или выберите «Отладка» > «Windows» > «Память» > «Память 1». Затем введите «&имя_переменной» в поле адреса.

Пример паузы в точке останова отладчика Visual Studio для языка ассемблера

Кроме того, мы можем выполнять пошаговую отладку с помощью функций «Шаг с заходом» и «Шаг с обходом».

Приложение B: Настройка проекта 64-разрядной сборки

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

1. Выберите 64-разрядную платформу

На панели инструментов установите для платформы решений значение «x64».

2. Создание исходного кода 64-битной сборки

Скопируйте приведенный ниже код, чтобы заменить старый код в main.asm:

64-битный ассемблерный код

Обратите внимание, что 32-битный и 64-битный ассемблерный код во многом различаются.

В 64-битном коде сборки:

  • Некоторые директивы, например ".386", не используются.
  • В PROTO не указан список параметров.
  • В END не указан «основной» начальный символ.
  • При вызове API Win32, например ExitProcess, параметры будут передаваться в регистры (rcx, rdx, r8, r9). (подробности см. в Приложении C)

3. Указание «основного» начального символа (точки входа)

При сборке может появиться ошибка: неразрешенный внешний символ mainCRTStartup.

Чтобы исправить эту ошибку:

  • Откройте страницу свойств проекта (см. изображение ниже), выбрав «Проект» > «Свойства».
  • Затем убедитесь, что выбрана конфигурация «Активная (отладка)» и платформа «x64».
  • Установите Linker > Advance > Entry Point на «main»

Если вы также хотите использовать сборку в режиме выпуска, сделайте то же самое для конфигурации: «Выпуск», платформа: «x64».

Вы также можете выбрать подсистему: Консоль или Windows по своему усмотрению.

Запустите программу. Код возврата от вызова ExitProcess будет корректно отображаться в окнах вывода.

Приложение C: Соглашение о вызовах Microsoft x64

  • Первые четыре аргумента передаются регистрами (rcx, rdx, r8, r9).
  • Некоторая часть памяти стека, называемая теневой областью, должна быть зарезервирована (не менее 4*8 байт)
  • Выравнивание 16-байтового указателя стека (rsp = регистр указателя стека) необходимо перед вызовом любого API win32.

Вот почему эта строка в 64-битном ассемблере:

Нам нужно зарезервировать не менее 32 байт (20 часов) в качестве теневой области. И основной процесс всегда начинается с адреса, заканчивающегося на 8h. Итак, чтобы выполнить выравнивание по 16 байтам, нам нужно добавить еще (8h) байт. Вот почему мы вычитаем rsp на (28h) байт. (стек растет вниз)

Рассмотрите следующий код. Этот код вызывает Win32 API MessageBox.

Я попытался изобразить структуру памяти стека вызовов на следующей диаграмме. Обратите внимание, что rsp-28h прекрасно выровняет указатель стека до 16-байтового выравнивания, потому что процедура main() всегда начинается с указателя стека, имеющего адрес, заканчивающийся на 8h. Вы можете убедиться в этом сами, отладив приведенный выше код, выполняя его шаг за шагом и наблюдая за значениями регистров в окне регистров.

Область стека соглашения о вызовах x64

Чтобы убедиться, что требуется выравнивание, попробуйте изменить «sub rsp, 28h» на «sub rsp, 20h». Это вызовет ошибку времени выполнения Access Violation при вызове MessageBox():

Некоторые API Win32 не столь строги. Например, ExitProcess не вызывает исключение нарушения прав доступа. Но чтобы соблюдать соглашение о вызовах x64, каждый 64-битный ассемблерный код, который вызывает Win32 API, должен иметь некоторый оператор, например «sub rsp, 28h», чтобы зарезервировать теневую область и настроить выравнивание указателя стека.

Обратите внимание, что при использовании полного кода пролога/эпилога x64 «sub rsp, 28h» необходимо изменить на «sub rsp, 20h», поскольку предыдущая инструкция «push» изменила rsp на 8h байтов. Итак, нужно вычесть всего 20 часов.

Читайте также: