Почему при поиске сборок различается поиск publicKeyToken при запуске от имени администратора и обычного пользователя?

Я следую инструкциям из учебного пособия по Microsoft .Net 2006 года, выполняя одно из упражнений. (В частности, это курс MS2349B, и я выполняю упражнение 2 модуля 4). Эти упражнения, кажется, созданы для времен, предшествовавших 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()

Обратите внимание на администратор, он фактически ищет правильный publicKeyToken.

Что дает? Почему будут отличаться искомые токены publickKeyTokens? Что я мог сделать не так?

РЕДАКТИРОВАТЬ

Конфигурация приложения, которую нам сказали использовать, может быть виновником, мне интересно, должны ли вы быть администратором, чтобы применить некоторые из этих настроек. Избавление от него, похоже, приводит к сбою работы от имени администратора (хотя в этом случае 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>
9
задан Doug T. 2 October 2011 в 15:05
поделиться