我下面從2006年微軟的.Net當然工作簿的指令,通過練習一個去。 (具體來說,這門課程是MS2349B,我正在做第4單元練習2)。這些練習似乎是在Vista以前的日子裏建立的,當時每個人都有完全的管理權限。 (我使用.NET 4.0。)探測程序集時爲什麼搜索到的publicKeyToken與管理員vs作爲普通用戶運行時有所不同?
這項工作涉及到建立一個強大的名字大會在GAC安裝它,建立對強命名程序集本地可執行文件,覈實該可執行文件運行。
#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
具體根據教程中,我使用#if
塊登入我的組件工作室命令提示符以管理員身份運行:
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()
有什麼奇怪,我是該公鑰是不一樣的東西是在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()
公告管理員,它實際上搜索正確的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>
你簽署了程序集嗎?我在CSC聲明中看不到關鍵文件。 – user957902
@ user957902我使用上面的#if STRONG塊對它們進行簽名,因爲MS2349B工作簿中的示例告訴我 –
.snk文件來自哪裏?如果你自己創建了,那麼你將不得不改變配置文件中的標記值。 –