Как добавить манифест сборки в исполняемый файл.NET?
Как добавить манифест сборки в мой исполняемый файл.NET?
Манифест сборки - это XML-файл, который добавляется в переносимый исполняемый файл.NET с типом ресурса. RT_MANIFEST
(24).
Сборочные манифесты используются для объявления некоторых вещей об исполняемом файле, например:
Если я хочу отключить DPI-масштабирование, потому что я хороший разработчик:
<!-- We are high-dpi aware on Windows Vista --> <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> </asmv3:windowsSettings> </asmv3:application>
Я могу заявить, что я был разработан и протестирован на Windows 7, и я должен продолжать зависеть от любых ошибок в Windows 7
<!-- We were designed and tested on Windows 7 --> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!--The ID below indicates application support for Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> </application> </compatibility>
я могу заявить, что я хороший разработчик и мне не нужна виртуализация файлов и реестра
<!-- Disable file and registry virtualization --> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo>
я могу заявить, что я зависим от конкретной версии 6 библиотеки Microsoft Common Controls:
<!-- Dependency on Common Controls version 6 --> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*"/> </dependentAssembly> </dependency>
я могу заявить, что я зависим от конкретной версии GDI+:
<dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.GdiPlus" version="1.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency>
В старые времена мы создавали файл сценария ресурса (*.rc
), например:
wumpa.rc
1 24 AssemblyManifest.xml
добавьте этот файл в проект, и компилятор скомпилирует .rc
файл; включая ресурсы в окончательный исполняемый образ.
За исключением Visual Studio 2010, похоже, нет способа добавить файл сценария ресурса в проект.
Как добавить скрипт ресурса в проект в Visual Studio 2010?
Как добавить манифест сборки в проект в Visual Studio 2010?
Примечание. Любое решение должно работать в среде с контролем версий и несколькими разработчиками (например, жестко заданные пути к, возможно, не установленным двоичным файлам нарушат сборку и не будут работать).
Бонус Болтовня
- VS2010/.NET: Как встроить ресурс в исполняемый файл.NET PE?
- VS2005: Как встроить манифест в сборку: позвольте мне сосчитать пути... (не может быть сделано)
Обновление: Майкл Фокс предлагает использовать диалоговое окно свойств проекта для включения манифеста сборки, но он не указывает, где:
Обновление: вещи, которые я пробовал:
- На экране свойств проекта выберите Приложение. Выберите опцию Иконка и Манифест. Под Манифестом оставьте опцию по умолчанию
Embed manifest with default settings
:
Не работает, потому что он встраивает манифест с настройками по умолчанию, а не с моими настройками.
В разделе " Манифест" измените параметр комбо на
Create application without a manifest
:Не работает, потому что не встраивает манифест
Под Ресурсами выберите опцию Resource File:
Не работает, потому что вы не можете выбрать манифест сборки (или скрипт ресурса, который включает манифест сборки)
В разделе " Ресурсы" выберите параметр " Файл ресурсов ", а затем введите путь к XML-файлу манифеста сборки:
Не работает, потому что Visual Studio задыхается при представлении с манифестом сборки:
- В разделе " Ресурсы" выберите параметр " Файл ресурсов" и введите путь к файлу сценария ресурса:
Не работает, потому что Visual Studio задыхается при представлении со сценарием ресурса:
Добавить
AssemblyManifest.xml
в моем проекте, а затем найдите его в поле со списком Manifest:Не работает, потому что файл манифеста сборки не указан в качестве опции
у меня есть еще дюжина других вещей, которые я могу продолжать снимать с экрана (добавьте файл.rc к решению, найдите его в раскрывающемся списке, выберите "без манифеста" и измените
wumpa.rc
строить действия на разные вещи, строить.rc
файл с помощью отдельного компилятора ресурсов, либо вручную, либо на этапе предварительной сборки / сборки, и выберите этот.res
файл как мой ресурс). я перестану добавлять лишнюю массу на мой вопрос и надеюсь на ответ.
3 ответа
Если вы хотите добавить пользовательскую информацию в манифест вашего приложения, вы можете выполнить следующие действия:
- Щелкните правой кнопкой мыши проект в обозревателе решений.
- Нажмите "Добавить новый элемент".
- Выберите "Файл манифеста приложения".
Это добавляет файл с именем app.manifest
к вашему проекту, который вы можете открыть и изменить по своему усмотрению.
Аналогичные шаги со скриншотами, снятые с объявления управляемых приложений как DPI-Aware на MSDN:
В обозревателе решений щелкните правой кнопкой мыши свой проект, выберите " Добавить", а затем нажмите " Новый элемент".
В диалоговом окне " Добавление нового элемента " выберите " Файл манифеста приложения" и нажмите " Добавить". Откроется файл app.manifest.
Скопируйте и вставьте следующий текст в файл app.manifest, а затем сохраните.
<?xml version="1.0" encoding="utf-8"?> <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <!-- Disable file and registry virtualization. --> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> <!-- <requestedExecutionLevel level="asInvoker" uiAccess="false" /> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> --> </requestedPrivileges> </security> </trustInfo> <!-- We are high-dpi aware on Windows Vista --> <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> </asmv3:windowsSettings> </asmv3:application> <!-- Declare that we were designed to work with Windows Vista and Windows 7--> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!--The ID below indicates application support for Windows Vista --> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> <!--The ID below indicates application support for Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> </application> </compatibility> <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) --> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </asmv1:assembly>
В обозревателе решений щелкните правой кнопкой мыши проект и выберите Свойства, чтобы убедиться, что используется app.manifest.
Ваше приложение теперь отображается как "предназначенное для Windows" и
- отключает виртуализацию файлов и реестра
- отключает масштабирование приложений DWM
- объявляет, что вы были разработаны и протестированы на Windows 7 и Windows Vista
- принимает зависимость от библиотеки Common Controls версии 6 (что позволяет использовать визуальные стили общими элементами управления)
У меня Visual Studio 2010 Professional с установленным пакетом обновления 1. Я использую 64-разрядную версию Windows 7 Ultimate. Если я буду следовать этим инструкциям, в свойствах проекта в блоке ресурсов появится "Встроить манифест с настройками по умолчанию", а также эта опция отключена! При сборке манифест не внедряется в DLL, как я проверял, открывая DLL в представлении ресурсов.
Однако если я:
- Найдите добавленный файл app.manifest в обозревателе решений.
- Щелкните правой кнопкой мыши и выберите "Свойства".
- Измените свойство Build Action с "None" на "Embedded Resource"
- перестраивать
Файл манифеста встроен правильно, что я могу проверить, загрузив DLL в представление ресурсов. Параметр "Манифест" в свойствах приложения по-прежнему отображается как "Встроить манифест с настройками по умолчанию" и по-прежнему отключен.
В Visual Studio 2008 это можно сделать в окне "Свойства проекта". Я почти уверен, что то же самое в 2010 году. Щелкните правой кнопкой мыши на своем проекте, выберите свойства, и на вкладке приложения вы можете выбрать манифест. Сначала вы должны добавить его в свой проект, но вы можете легко сделать это, добавив существующий файл.