2011-10-01 25 views
9

我下面從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> 
+0

你簽署了程序集嗎?我在CSC聲明中看不到關鍵文件。 – user957902

+0

@ user957902我使用上面的#if STRONG塊對它們進行簽名,因爲MS2349B工作簿中的示例告訴我 –

+1

.snk文件來自哪裏?如果你自己創建了,那麼你將不得不改變配置文件中的標記值。 –

回答

1

搜索您的磁盤AReverser.dll。您可能在某處隱藏了一些額外的副本。 VS可以製作編譯dll的影子副本。

如果不幫助活化融合日誌(使用fuslogvw.exe或閥芯融合日誌到磁盤),然後看看在有問題的dll是從裝載日誌。 IMO它是加載錯誤的DLL。

0

哪裏是你的解決方案表示該組件? Visual Studio中不使用GAC建所以如果你有一個不同的版本,在您的參考目錄中留下的aigned總成裝配,客戶端將針對建立和當試圖在運行時加載,因爲GAC首次加載失敗。

相關問題