Dou*_* T. 9 .net c# assemblies gac
我正在按照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
Run Code Online (Sandbox Code Playgroud)
我以本地用户身份构建可执行文件:
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
Run Code Online (Sandbox Code Playgroud)
我通过以管理员身份运行的visual studio命令提示符将其安装到GAC中:
C:\path\to\lab>gacutil /i AReverser_v2.0.0.0\AReverser.dll
Run Code Online (Sandbox Code Playgroud)
当我在管理员提示符下运行我的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()
Run Code Online (Sandbox Code Playgroud)
对我来说奇怪的是publicKeyToken与GAC中的内容不同:
AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027634b66
Run Code Online (Sandbox Code Playgroud)
但是,如果我从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()
Run Code Online (Sandbox Code Playgroud)
请注意,在Admin下,它实际上正在搜索正确的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>
Run Code Online (Sandbox Code Playgroud)
在磁盘中搜索 AReverser.dll。您可能在某个隐藏的地方有一些额外的副本。VS 可以制作已编译的 dll 的卷影副本。
如果这不能帮助激活融合日志记录(使用 fuslogvw.exe 或将融合日志假脱机到磁盘),然后查看加载有问题的 dll 的日志。IMO 这是加载了错误的 dll。