Приветствую всех, сегодня я хотел поговорить о манифестах, и как их можно использовать.
Сборка имеет несколько видом информации, и мы их все расмотроим:
Первый вид это манифест сборки-он позволяет среды .NET предостовлять сведения, это имя,версия, разрешения и ссылки.
Воторой вид- это манифест приложения-который предоставляет сведение для OS, в него входит варианты развертывания сборки, а так же запрос полномочий до администратора.
Третий вид это скомпилированные типы, это метаданные и код, которые определены внутри сборки.
Четвертый вид это ресурсы-это все материалы которые вошли в сборку, это изображения, локальный текст итд.
В середине 90 при написании приложения, программы могли подменять системные библиотеки, тем самым заменять их старыми версиями, и новые программы отказывались работать. Это привело к тому что в 2000 придумали использовать манифест который шел внутри самого приложения. В нем находилось описание какая версия операционной системы требуется для работы, библиотеки, версия программы. Всю эту информацию мы могли увидеть если бы выбрали исполняемый фаил и нажали на его свойство. Так называемый манифест сборки.
А изменить все это мы могли в Свойствах проекта>Приложение>Сведения о сборке:
Все поля мы можем заполнить с нашими предпочтениями, сохранить и у нас обновиться манифест сборки, который храниться в файле AssemblyInfo.cs:
Однако это не решало не которых проблем и было придуманы манифесты приложения который сейчас просто незаменим при использовании приложений работающий с реестром и системным диском. А все дело в том что этот манифест использует Xml формат и в нем содержится информация о том как можно запустить приложение. И оптимизировать работу приложения под конкретную версию Windows вообще то в нем уже содержатся комментарии которые, достаточно раскомментировать и пересобрать свой проект с новыми возможностями.
Пример моего манифеста:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
<?xml version="1.0" encoding="utf-8"?> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <!--Параметры манифеста UAC Если вы хотите изменить уровень контроля учетных записей, замените узел requestedExecutionLevel на один из следующих. <requestedExecutionLevel level="asInvoker" uiAccess="false" /> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> При указании элемента requestedExecutionLevel будет отключена виртуализация файлов и реестра. Удалите этот элемент, если виртуализация требуется приложению для обратной совместимости. --> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Список версий Windows, на которых это приложение было протестировано и будет работать. Раскомментируйте соответствующие элементы, чтобы ОС Windows автоматически выбрала наиболее совместимое окружение. --> <!-- Windows Vista --> <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />--> <!-- Windows 7 --> <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />--> <!-- Windows 8 --> <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />--> <!-- Windows 8.1 --> <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />--> <!-- Windows 10 --> <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />--> </application> </compatibility> <!-- Указывает, что приложение поддерживает определение DPI и не будет автоматически масштабироваться Windows при более высоких значениях DPI. Приложения Windows Presentation Foundation (WPF) по умолчанию поддерживают определение DPI, им не нужно специально включать параметр для этого. Для приложений Windows Forms на платформе .NET Framework 4.6, для которых задан этот параметр, необходимо также задать для "EnableWindowsFormsHighDpiAutoResizing" значение "true" в файле app.config.--> <!-- <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> </windowsSettings> </application> --> <!-- Включите темы для общих элементов управления и диалоговых окон Windows (Windows XP и более поздние версии) --> <!-- <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> --> </assembly> |
К примеру для того что бы появилось окно запуска приложения от имени администратора у пользователя нам нужно в строчке установить параметр:
1 |
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> |
Первоначально он у вас :
1 |
<requestedExecutionLevel level="asInvoker" uiAccess="false" /> |
И при запуске приложения вы должны увидеть:
Тема эта очень обширная, и большая, хорошо описана в книге C# 6.0 Справочник. Полное описания языка. Советую ее прочитать, для полного понимания значения манифеста, лично я хотел продемонстрировать, то как можно вывести окно пользователю о необходимости запуска приложения от имени администратора.
Подскажите, как сделать, чтобы в Debug сборке подставлялась строчка в манифесте:
А в Realease:
?
Подскажите, как сделать, чтобы в Debug сборке подставлялась строчка в манифесте:
requestedExecutionLevel level=»asInvoker» uiAccess=»false»
А в Realease:
requestedExecutionLevel level=»requireAdministrator» uiAccess=»false»
?
Через директивы препроцессора можно сделать, из кода менять права, в самом манифесте условие выставить нельзя.