Я следую инструкциям из учебного курса Microsoft .Net 2006 года, выполняя одно из упражнений. (В частности, этот курс MS2349B, и я делаю Упражнение 2 модуля 2.). Похоже, что эти упражнения созданы для дней, предшествующих Vista, когда каждый имеет все права администратора. (Я использую .net 4.0.)
Это упражнение включает создание сборки со строгим именем, установку ее в GAC, создание локального исполняемого файла для сборки со строгим именем, проверку того, что исполняемый файл выполняется.
Согласно руководству, я подписываю свою сборку, используя блок #if
:
#if STRONG
[assembly: System.Reflection.AssemblyVersion("2.0.0.0")]
[assembly: System.Reflection.AssemblyKeyFile("OrgVerKey.snk")]
#endif
Я создаю свой исполняемый файл как локальный пользователь:
C:\path\to\lab>csc /define:STRONG /target:library
/out:AReverser_v2.0.0.0\AReverser.dll AReverser_v2.0.0.0\AReverser.cs
C:\path\to\lab>csc /reference:MyStringer\Stringer.dll
/reference:AReverser_v2.0.0.0\AReverser.dll Client.cs
Я устанавливаю его в GAC через командную строку visual studio, запускаемую от имени администратора:
C:\path\to\lab>gacutil /i AReverser_v2.0.0.0\AReverser.dll
Когда я запускаю свой exe в приглашении администратора, я получаю ожидаемый вывод - приложение работает нормально и, похоже, правильно загружает dll из gac. При запуске из командной строки без прав администратора я получаю следующую ошибку
Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl
y 'AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b5fcbdcff229fabb'
or one of its dependencies. The located assembly's manifest definition does not
match the assembly reference. (Exception from HRESULT: 0x80131040)
at MainApp.Main()
Что странно для меня, это то, что publicKeyToken отличается от того, что есть в GAC:
AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027634b66
НО, если я удаляю AReverser из GAC и пытаюсь запустить свой exe-файл как приглашение администратора, я получаю следующую ошибку, которая указывает, что он ищет ожидаемый токен открытого ключа f0548c0027634b66:
C:\path\to\lab>gacutil /u "AReverser,Version=2.0.0.0,Culture=neutral,
PublicKeyToken=f0548c0027634b66"
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Assembly: AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027
634b66
Uninstalled: AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0
027634b66
Number of assemblies uninstalled = 1
Number of failures = 0
C:\path\to\lab>Client.exe
Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl
y 'AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027634b66'
or one of its dependencies. The located assembly's manifest definition does not
match the assembly reference. (Exception from HRESULT: 0x80131040)
at MainApp.Main()
Обратите внимание на Admin, в действительности он ищет правильный publicKeyToken.
Что дает? Почему искомые publickKeyTokens будут отличаться? Что я мог сделать не так?
EDIT
Конфигурация приложения, которую нам сказали использовать, может быть виновником, мне интересно, нужно ли вам быть администратором, чтобы применить некоторые из этих настроек. Избавление от этого, по-видимому, приводит к сбою в качестве администратора (хотя в этом случае publicKeyToken указан как NULL). Вот мой конфиг приложения
<configuration>
<runtime>
<assemblyBinding
xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="MyStringer"/>
<publisherPolicy apply="no"/>
<dependentAssembly>
<assemblyIdentity name="AReverser"
publicKeyToken="f0548c0027634b66"
culture=""/>
<publisherPolicy apply="no"/>
<bindingRedirect oldVersion="2.0.0.0"
newVersion="2.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>