При поиске сборок, почему искомый publicKeyToken отличается при работе от имени администратора и обычного пользователя? - PullRequest
9 голосов
/ 01 октября 2011

Я следую инструкциям из учебного курса 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>

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Поиск на вашем диске AReverser.dll. Возможно, что у вас есть дополнительные копии где-то спрятаны. VS может делать теневые копии скомпилированных dll.

Если это не помогает активировать ведение журнала Fusion (используйте fuslogvw.exe или спулинги журнала Fusion на диск), а затем просмотрите журналы, из которых загружается проблемная библиотека DLL. IMO это неправильная dll, которая загружается.

0 голосов
/ 20 апреля 2012

Где ваше решение, скажем, сборка? Visual Studio не использует gac для сборки, поэтому если у вас в справочном каталоге осталась другая версия сборочной сборки с выравниванием, клиент будет построен против этого и потерпит неудачу при попытке загрузки во время выполнения, потому что gac загружается первым ,

...