Данные С# Значение PublicKeyToken
Если я открою Resource.resx из моей папки С# проекта, я увидел что-то вроде этого:
Что такое PublicKeyToken и какое значение мне следует назначать?
.NET работает с сборками; каждый EXE или DLL файл считается сборкой.
Для того, чтобы сборка была распознана глобально на машине любым другим кодом .NET, который нуждается в ней (без копирования ее локально, конечно), вы можете размещать сборки в глобальном кэше сборок aka GAC.
Вы не можете разместить только какую-либо сборку в GAC, так как по соображениям безопасности размещение сборки там требует строгого ввода, подписанного aka. Не попадет сюда в процесс подписания сборки, поскольку это не имеет значения, но часть процесса подписания получает открытый ключ. Затем вы можете использовать этот же ключ для любого количества сборок, поэтому в сборке может быть один ключ, но один ключ может быть разделен множеством разных сборок.
Когда .NET загружает строго типизированную сборку, он должен получить три параметра:
- Название сборки.
- Сборочная версия.
- Открытый ключ сборки.
При любом из этих недостающих или неправильных,.NET будет вызывать ошибку, что он не может найти сборку.
Теперь для вашего последнего вопроса: с учетом известного имени сборщика, как найти его токен открытого ключа?
Ну, все системные сборки до 4.0 можно найти с помощью Windows Button + R , затем набрав %windir%\assembly и ENTER . Вам будет представлена полная таблица установленных сборок с именем, версией и ключом. Например, вы можете увидеть, что ключ, размещенный в исходном вопросе, действительно принадлежит сборке System.Drawing.
Из-за нарушения изменений в структуре 4.0 местоположение GAC для своих сборок изменилось на %windir%\Microsoft.NET\assembly\ , и оно больше не отображается в дружественном списке, а скорее как папки и файлы: каждая сборка в новом GAC имеет свои собственные и от его имени вы можете извлечь общедоступный токен. Например, System.Web содержит следующую подпапку:
Итак, это означает, что ключ b03f5f7f11d50a3a и что вы должны поместить в файл .resx , если у вас есть ссылка на сборку System.Web. (Обратите внимание, что это то же самое, что и ключ System.Drawing, но здесь это не очень важно)
Корпорация Майкрософт решает проблему “разблокировки открытого ключа”, используя хэш открытый ключ общедоступной сборки. Эти хеши упоминаются как токены открытого ключа и низкие 8 байтов SHA1-хэша открытый ключ общедоступной сборки. Хеши SHA1 составляют 160 бит (20 байт), а верхние 12 байтов хэша просто отбрасываются в этот алгоритм.
Если вы посмотрите на свойства этой ссылки, вы заметите, что по умолчанию для параметра “Копировать локальную” установлено значение “Истина”.
Could not find file ‘Microsoft.Windows.Common-Controls, Version=6.0.0.0, Culture=*, PublicKeyToken=6595b64144ccf1df,
I’m trying to integrate this library into my application.
At first it crashed with
so I uncommented
as was recommended here.
Now the application won’t compile with the following message:
Deleting app.manifest causes the app to crash, because I’m using Microsoft Ribbon.
How do I fix this error?
3 Answers 3
The file you are trying is not supported on Windows 7. This means you would have to supply it, if your trying to develop an application that works on Windows XP, simplest solution is to drop support for Windows XP.
Mainstream Support for Microsoft Visual Basic 6.0 ended on March 31, 2005. However, we are releasing this non-security related package because it contains improvements that were ready for release just prior to the end of Mainstream Support. Microsoft Visual Basic 6.0 has transitioned to Extended Support which runs through March 31, 2008. Microsoft is not extending the Mainstream Support phase for Microsoft Visual Basic 6.0 in any way.
Supported operating systems: Windows 2000, Windows 2000 Advanced Server, Windows 2000 Professional Edition , Windows 2000 Server, Windows 98, Windows 98 Second Edition, Windows ME, Windows NT, Windows Server 2003, Windows XP, Windows XP Home Edition , Windows XP Media Center Edition, Windows XP Professional Edition, Windows XP Tablet PC Edition
Until you stop using this file, it cannot be run as a 64-bit process, on any Windows operating system including the 64-bit Windows XP Edition.
There is no reason you could not modify the behavior of the code you want to use to supported files.
Зачем Win32-приложению манифест?
Недавно на руборде в разделе Программирование был задан вопрос: «Зачем Win32-приложению манифест? На что он влияет?». Первое, что сразу приходит в голову большинству программистов — это темы оформления. Но на самом деле в современных виндах манифест нужен не только для этого. Я подумал и написал пять ключевых аспектов, на которые влияет манифест или его отсутствие. После этого сразу несколько человек попросили оформить этот пост в виде более развернутой статьи.
Для начала предлагаю вспомнить, как вообще в Windows появились манифесты, и как они развивались.
История манифеста
В древние времена в мире Win95/98 царил ад, точнее DLL hell. Возник он из-за того, что Windows задумывалась как идеальная система. Все приложения в ней всегда должны были писаться с использованием самых свежих версий системных библиотек. А различные версии самих библиотек должны были быть взаимозаменяемыми. Реальность быстро доказала всем, что для популярной операционки это несбыточная мечта, так и возник ад. Каждое второе приложение во время инсталляции перезаписывало системные библиотеки нужными ему версиями. В результате после установки приложения X установленное ранее приложение Y начинало глючить. А после переустановки приложения Y глючить начинало приложение X. В общем юзерам жилось весело.
Для решения этой проблемы в Windows XP появилась технология Side-by-side Assembly (SxS). Суть ее заключалась в том, что приложение могло явно указать, с какой версией библиотеки оно желает работать. Эта информация могла указываться либо в специальном файле .manifest, либо в ресурсах приложения в разделе Manifest. В самой ХР на основе новой технологии реализовали одну из самых заметных новых фишек системы — темы оформления.
Всем был хорош SxS кроме одного — он был ужасно неудобен для программиста. В 99% случаев манифест применялся только для включения тех самых тем оформления, и ни для чего больше. Разработчикам винды стало ясно, что нужен новый, более простой в использовании способ указать поддерживаемые версии системных библиотек. Тогда они придумали простое правило: в пределах одной версии системы интерфейс и поведение этих библиотек не изменяется. Нужно было только каким то образом научится определять какая их версия требуется конкретному приложению. Так в Windows 7 в манифесте появилась секция Compatibility, где можно указать с какими версиями ОС тестировалось приложение.
Также в манифесте начиная с Windows Vista появилось еще несколько секций, обо всех о них ниже.
Функции манифеста
- Активация тем оформления (Visual Styles)
Эта технология появилась в ХР и полностью основана на SxS. Работает просто: вы запрашиваете у системы ComCtl32.dll шестой версии, и — вуаля — все стандартные контролы рисуются согласно с активированной в системе темой. Если же вы не упомянете в манифесте ComCtl32.dll, или манифест вообще будет отсутствовать в приложении, то система по умолчанию загрузит ComCtl32.dll пятой версии, которая отрисовывает контролы в стиле Win95. Кроме поддержки тем оформления, шестая версия ComCtl32.dll содержит кое-какой функционал, которого нету в пятой версии. Поэтому если отключить темы оформления, некоторые приложения будут работать и выглядеть не так, как задумывали их авторы.
Справа тоже самое приложение без манифеста:
Взаимодействие с UAC имеет несколько аспектов:
- Ключ requestedExecutionLevel.level позволяет указать требуемый приложению уровень прав пользователя. К примеру если указать requireAdministrator, то приложению будут предоставлены права администратора (если пользователь разрешит).
Запрос разрешения пользователя:
Если вся секция по взаимодействию с UAC отсутствует в манифесте, к приложению будет применена виртуализация файловой системы и реестра. Если такое приложение попытается записать что то в защищенные папки типа «Program files», оно будет перенаправлено в папку “%userprofile%\AppData\Local\VirtualStore\Program files». Аналогично, попытки записи в раздел реестра HKEY_LOCAL_MACHINE будут перенаправлены в «HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE». Естественно, сделанные таким образом изменения будут видны только приложениям, запущенным в режиме виртуализации.
Виртуализация файловой системы в деле:
С древнейших времен винда имеет механизм масштабирования интерфейса в зависимости от DPI монитора (тут говорится, что все началось в XP, но мне кажется, что раньше). В те времена эта настройка выставлялась только вручную, наверное из-за отсутствия EDID. Популярностью она не пользовалась, возможно потому, что запрятана была далеко, а возможно потому, что мониторов с большим разрешением было очень-очень мало. Кроме того, большая часть работы, необходимой для поддержки масштабирования, была отдана на откуп самим приложениям и их авторам. А программисты, как известно, люди весьма ленивые, поэтому куча софта для винды писалась в предположении, что DPI всегда равен стандартному значению 96. Очень часто встречалась ситуация, когда в приложении использовались библиотеки поддерживающие нестандартный DPI, в то время как код самого приложения его не поддерживал. Это приводило к появлению ужасных артефактов в интерфейсе приложения, стоило пользователю выставить DPI, к примеру, в значение 120 (масштабирование 125%):
Разработчики Висты не стерпели подобного безобразия, и заложили в DWM возможность производить масштабирование самостоятельно, а приложениям врать, что DPI по прежнему равен 96. Причем зависящие от него системные настройки, разрешение монитора и даже положение мыши, также пересчитываются. К сожалению разработчики Висты небыли волшебниками, поэтому масштабирование DWM производит с помощью простых алгоритмов растягивания изображений. И если интерфейс приложения нужно увеличить, то происходит замыливание картинки. Представьте что было бы, если бы разработчики Фотошопа не могли это отключить. Таких бунтов на корабле никто не хотел, поэтому появилась возможность указать в манифесте, что ваше приложение таки умеет нормально масштабировать свой интерфейс, и помощь DWM ему не нужна. За это отвечает параметр dpiAware. Тут правда следует отметить, что по умолчанию масштабирование силами DWM включается при увеличении 150% и выше. Видимо в Microsoft посчитали, что при масштабировании 125% артефакты как на скриншоте выше вполне терпимы.
Слева масштабирование силами DWM, а справа — самого приложения:
В Windows 8.1 появилась возможность указывать разный масштаб разным мониторам, если подключено сразу несколько. Соответственно у ключа dpiAware появилось новое значение «True/PM». Оно означает, что приложение умеет динамически изменять масштаб своего интерфейса при переносе окон с одного монитора на другой.
Декларирование совместимости
Работает очень просто: программист тестирует свое приложение в определенной версии винды, и если все работает как надо, добавляет GUID этой версии в манифест.
Наиболее интересен вопрос: «На что влияют эти GUID-ы?» Пока что список различий в поведении системных библиотек невелик. Наиболее интересно упоминание об оптимизации RPC. Получается что приложения, задекларировавшие совместимость с семеркой, будут работать быстрее.
В будущем этот раздел манифеста наверняка будет играть большую роль чем сейчас. Ведь в винде полно разных хаков призванных обеспечивать совместимость. И теперь есть возможность оградить от них нормальные приложения.
Если GUID-ы полностью отсутствуют в манифесте, то к приложению применяются правила как к совместимому с Вистой:
Microsoft windows common controls publickeytoken
Всем привет
давно слышал delphi сохраняет IP адрес локальной машины где была произведена компиляция в exe файл.
Где об этом можно почитать?
И какие еще компиляторы сохраняют подобную информацию?
← →
Kerk © ( 2010-06-07 09:48 ) [1]
← →
Rouse_ © ( 2010-06-07 10:27 ) [2]
Это все брехня — пишется только номер паспорта и военного билета, а апишник твой никому не сдался.
← →
tesseract © ( 2010-06-07 11:34 ) [3]
При использовании Indy там запросто можно «забить» свой IP. Так что останется в ресурсах. Но это уже не компилятор а кривые руки.
← →
Rouse_ © ( 2010-06-07 11:50 ) [4]
При прямых руках туда всю библиотеку имени ленина забить можно, и чего? 🙂
> Rouse_ (07.06.2010 11:50:04) [4]
Это будет нарушение копирайта.
← →
antonn © ( 2010-06-07 13:27 ) [6]
← →
Правильный$Вася ( 2010-06-08 00:08 ) [7]
> delphi сохраняет IP адрес локальной машины
а если ни одного сетевого протокола не инсталлировано?
← →
Германн © ( 2010-06-08 00:13 ) [8]
> а если ни одного сетевого протокола не инсталлировано?
Тогда кроме номера паспорта записывается и адрес места жительства.
← →
Dima84 ( 2010-06-08 01:19 ) [9]
Кстати, что такое publicKeyToken=»6595b64144ccf1df» и могут ли потом идентифицировать, что проект разрабатывался на моем комп.
А, догнал по манифестам, это не то.
← →
Dima84 ( 2010-06-08 01:23 ) [11]
myusername, легко проверить твои слухи. Взять 2 компьютера и скомпелить одно и тоже, далее сравнить содержимое на различия.
← →
Германн © ( 2010-06-08 01:59 ) [12]
> Dima84 (08.06.10 01:23) [11]
>
> myusername, легко проверить твои слухи.
Не смеши. Кто будет проверять «бред мании преследования»?
Сабж — развод, имхо.
← →
brother © ( 2010-06-08 05:20 ) [13]
> давно слышал delphi сохраняет IP адрес локальной машины
это было давно и не правда 😉
имхо, развод.
← →
Anatoly Podgoretsky © ( 2010-06-08 09:55 ) [14]
> Dima84 (08.06.2010 01:19:09) [9]
Dima84 (08.06.10 01:19) [9]
6595b64144ccf1df — Это размер противогаза, номер военкомата и военно учетная специальность, в base64.