2011-10-01 5 views
9

私は、2006 Microsoft .Netコースワークブックの指示に従っており、演習の1つを行っています。 (特にこのコースはMS2349Bで、私はモジュール4の演習2をやっています)。これらの演習は、誰もが完全な管理者特権を常に持っているVista前の日のために構築されたようです。 (私は.net 4.0を使用しています)アセンブリをプロービングすると、adminとvsを通常のユーザーとして実行すると、publicKeyTokenの検索が異なるのはなぜですか?

この演習では、厳密な名前のアセンブリを作成し、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() 

何私には奇妙だことなPublicKeyTokenは何がGACにだとは同じではないということです。

AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=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() 

お知らせ:私はその期待が公開キートークンf0548c0027634b66探しを示し、次のエラーを取得GACからAReverserをアンインストールし、管理者のプロンプトとして私のexeファイルを実行しようとします管理者は実際に正しいpublicKeyTokenを探しています。

何がありますか? publickKeyTokensが検索される理由は何ですか?私は何が間違っていたでしょうか?

EDIT

我々が使用するように言われているアプリの設定を使用すると、これらの設定の一部を適用する管理者でなければならない場合、私は思ったんだけど、犯人かもしれません。それを取り除くことは、adminとして実行することを失敗させるように思えます(この場合、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 MS2349Bワークブックの例として、上記の#if STRONGブロックで署名します。 –

+1

.snkファイルはどこから来たのですか?自分で作成した場合は、設定ファイルのトークン値を変更する必要があります。 –

答えて

1

あなたのディスクでAReverser.dllを探してください。どこかに隠された追加のコピーがある可能性があります。 VSはコンパイルされたdllのシャドウコピーを作成できます。

フュージョンロギングを有効にすることができない場合(fuslogvw.exeまたはフュージョンフュージョンログをディスクに使用する)、問題のあるdllがロードされた場所のログを調べます。 IMO読み込まれたDLLが間違っています。

0

解決策はどこにありますか? Visual StudioはGACを使用してビルドすることはありません。したがって、参照されたアセンブリアセンブリの別のバージョンがリファレンスディレクトリに残っていると、クライアントはそのディレクトリに対してビルドされ、gacが最初にロードされるため。

関連する問題