7

DLLを参照するEXEがあります。この例では、TestDLL.dllと呼びます。
EXEはC#で記述され、DLLはVB.Netで記述されています。

DLLのデモアセンブリバージョンを作成しました。たとえば、TestDLL.dllバージョン1.0.0.0です。
デモバージョンDLL(1.0.0.0)を参照してEXEをコンパイルしたい。その後-EXEで同じDLLを使用したいのですが、GACに配置するDLLは、どのバージョンでも使用できます。
そのために、DLLの参照の「ローカルコピー」プロパティをFALSEに設定しました。

私の目標は、たとえば、コンパイル後、アセンブリバージョン2.1.6.0でGAC TestDLL.dllを配置し、EXEがアセンブリリダイレクトバインディングを使用してそれを検出することです。そのために、私は設定ファイルを使用しました。このリンクを使用して作成しました:http:
//msdn.microsoft.com/en-us/library/7wd6ex19 (v = vs.71).aspx

したがって、私の設定ファイルは次のようになります。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
         <assemblyIdentity name="myAssembly"
                           publicKeyToken="32ab4ba45e0a69a1"
                           culture="en-us" />
         <!-- Assembly versions can be redirected in application, publisher policy, or machine configuration files. -->
         <bindingRedirect oldVersion="1.0.0.0"
                          newVersion="2.1.6.0"/>
       </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

問題は、それをすべて実行した後、EXEを実行し、dllにアクセスすると、有名なエラーが発生すること です。System.IO.FileNotFoundException:ファイルまたはアセンブリを読み込めませんでした'TestDLL、Version = 1.0.0.0、Culture = neutral、 PublicKeyToken =9d8162944bd6fdc7'またはその依存関係の1つ。システムは、指定されたファイルを見つけることができません。ファイル名:'TestDLL、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = 9d8162944bd6fdc7'

つまり、EXEは、参照した元のDLLを見つけることができません。GACを「参照」するか、リフレクションを使用できることは知っていますが、このEXEはこの方法でのみ機能することになっているため、使用したくありません。

誰かが問題が何であり、それを修正する方法を知っていますか?
ありがとう

4

1 に答える 1

12

適切なを設定していることを確認してくださいpublicKeyToken。使用していることを示したコードpublicKeyToken="32ab4ba45e0a69a1"では、MSDNリンクの公開鍵トークンです。これは明らかに、アセンブリの公開鍵トークンではありません。これを機能させるには、両方のアセンブリ(1.0.0.0と2.1.6.0)を同じキーで署名する必要があります。公開鍵トークンを抽出するには、sn.exeツールを使用するか、取得している例外スタックトレースを確認します(これは、そのことを示していますpublicKeyToken="9d8162944bd6fdc7")。

sn.exe -Tp myassembly.dll

ただし、実行可能ファイルがコンパイルされたアセンブリが同じキーで署名されていない場合、これは機能しません。

また、あなたは設定したようですがculture="en-us"、あなたのアセンブリはこの文化を使用していますか?試すこともできますculture="Neutral"

最後に、適切なバージョンのアセンブリをGACにデプロイしたことを確認してください。

于 2012-04-17T06:45:25.430 に答える