Вопрос:
Если я открою Resource.resx из моей папки С# проекта, я увидел что-то вроде этого:
<data name=»picture» type=»System.Resources.ResXFileRef, System.Windows.Forms»> <value>..Resourcespicture.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data>
Что такое 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.NETassembly, и оно больше не отображается в дружественном списке, а скорее как папки и файлы: каждая сборка в новом GAC имеет свои собственные и от его имени вы можете извлечь общедоступный токен. Например, System.Web содержит следующую подпапку:
v4.0_4.0.0.0__b03f5f7f11d50a3a
Итак, это означает, что ключ b03f5f7f11d50a3a и что вы должны поместить в файл .resx, если у вас есть ссылка на сборку System.Web. (Обратите внимание, что это то же самое, что и ключ System.Drawing, но здесь это не очень важно)
Ответ №1
см. this
Корпорация Майкрософт решает проблему “разблокировки открытого ключа”, используя хэш открытый ключ общедоступной сборки. Эти хеши упоминаются как токены открытого ключа и низкие 8 байтов SHA1-хэша открытый ключ общедоступной сборки. Хеши SHA1 составляют 160 бит (20 байт), а верхние 12 байтов хэша просто отбрасываются в этот алгоритм.
Ответ №2
Если вы посмотрите на свойства этой ссылки, вы заметите, что по умолчанию для параметра “Копировать локальную” установлено значение “Истина”.