当探测程序集时,为什么作为管理员与普通用户运行时搜索publicKeyToken不同?

本文关键字:用户 运行时 搜索 不同 publicKeyToken 管理员 程序集 探测 为什么 | 更新日期: 2023-09-27 18:10:06

我遵循2006 Microsoft . net课程手册中的说明,进行其中一个练习。(具体来说,这门课程是MS2349B,我正在做模块4练习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

我通过visual studio命令提示符将其安装到GAC中,以管理员身份运行:

C:'path'to'lab>gacutil /i AReverser_v2.0.0.0'AReverser.dll

当我在管理员提示符中运行我的exe时,我得到了我期望的输出——应用程序运行良好,似乎从gac正确加载了dll。当我在非管理命令提示符下运行时,我得到以下错误

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

但是,如果我从GAC卸载AReverser并尝试运行我的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。

给了什么?为什么搜索publickeytokens会有所不同?我能做错什么吗?

编辑

我们被告知要使用的应用程序配置可能是罪魁祸首,我想知道你是否必须是管理员才能应用这些设置。摆脱它似乎会导致作为管理员运行失败(尽管在这种情况下publicKeyToken被列为NULL)。这是我的app config

<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>

当探测程序集时,为什么作为管理员与普通用户运行时搜索publicKeyToken不同?

在磁盘中搜索AReverser.dll。有可能你有一些额外的副本隐藏在某个地方。VS可以生成编译后的dll的影子副本。

如果这没有帮助激活融合日志(使用fuslogvw.exe或spool融合日志到磁盘),然后查看日志中有问题的dll是从哪里加载的。

你的解决方案说组装是什么?Visual studio不使用gac进行构建,因此如果参考目录中遗留了不同版本的已编译程序集,则客户端将根据该版本构建,并且在尝试在运行时加载时失败,因为首先加载的是gac。