262

Visual Studio 2005プロジェクト (厳密な名前が付けられています)に弱い名前のアセンブリを追加しました。私は今、エラーが発生しています:

「参照されたアセンブリ 'xxxxxxxx' には厳密な名前がありません」

このサードパーティ アセンブリに署名する必要がありますか?

4

16 に答える 16

226

このエラーを回避するには、次のいずれかを実行できます。

  • アセンブリを動的にロードする、または
  • サードパーティ アセンブリに署名します。

.NET-fu: Signing an Unsigned Assembly (Without Delay Signing)でサード パーティのアセンブリに署名する手順を確認できます。

サードパーティ アセンブリへの署名

サードパーティに署名するための基本原則は、

  1. 中間言語 (IL)を使用してアセンブリを逆アセンブルしildasm.exe、保存します。

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
    
  2. アセンブリを再構築して署名します。

    ilasm /dll /key=myKey.snk thirdPartyLib.il
    

追加参照の修正

上記の手順は、サード パーティのアセンブリ ( A.dll ) が別のライブラリ ( B.dll ) を参照している場合を除き、正常に機能します。上記のコマンドを使用して、A.dllB.dllの両方を逆アセンブル、再構築、および署名できますが、実行時にB.dllのロードは失敗します。これは、 A.dllが最初に署名されていないバージョンのB.dllを参照して構築されたためです。

この問題を解決するには、上記の手順 1 で生成された IL ファイルにパッチを適用します。B.dll の公開鍵トークンを参照に追加する必要があります。を呼び出して、このトークンを取得します。

sn -Tp B.dll 

次の出力が得られます。

Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30319.33440
Copyright (c) Microsoft Corporation.  All rights reserved.

Public key (hash algorithm: sha1):
002400000480000094000000060200000024000052534131000400000100010093d86f6656eed3
b62780466e6ba30fd15d69a3918e4bbd75d3e9ca8baa5641955c86251ce1e5a83857c7f49288eb
4a0093b20aa9c7faae5184770108d9515905ddd82222514921fa81fff2ea565ae0e98cf66d3758
cb8b22c8efd729821518a76427b7ca1c979caa2d78404da3d44592badc194d05bfdd29b9b8120c
78effe92

Public key token is a8a7ed7203d87bc9

最後の行には、公開鍵トークンが含まれています。次に、 A.dllの IL でB.dllへの参照を検索し、次のようにトークンを追加する必要があります。

.assembly extern /*23000003*/ MyAssemblyName
{
  .publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )                         
  .ver 10:0:0:0
}
于 2008-12-01T17:26:23.623 に答える
104

「厳密な名前キーを持たない」プロジェクトを使用しているプロジェクト ファイルを展開し、.snkファイル (.StrongNameKey) を探します。

Windows エクスプローラーでこのファイルをブラウズします(場所がわかるように)。

「厳密な名前のキーを持たない」プロジェクトの Visual Studio に戻り、次のことを行います。

  • プロジェクトファイルを右クリック
  • プロパティを選択
  • 「署名タブ」(左側)を選択します
  • 「アセンブリに署名する」チェックボックスをクリックします
  • 次に<Browse>.snk先ほど見つけたファイルに

これでうまくいくはずです。これは、同じソリューション内の別のプロジェクト内のフォームを使用して、あるプロジェクトの問題を解決しました。

お役に立てば幸いです。

于 2012-07-10T07:27:54.573 に答える
56

ソースコードを持っていないアセンブリや放棄されたプロジェクトを含むアセンブリに自動的に厳密な名前を付けるツールを作成しました。回答で説明されている多くの手法を、既存のツールや古い指示の欠陥や欠点なしで簡単な方法で使用します。

.NET アセンブリの厳密な名前の署名者

これが、サードパーティのアセンブリに署名する必要がある人の助けになることを願っています。

于 2013-10-18T21:52:11.473 に答える
43

アセンブリも署名されていない場合は、署名されていないアセンブリを使用できます。

于 2012-06-02T16:04:34.943 に答える
30

サードパーティのアセンブリに署名するとうまくいきました:

参照されたアセンブリに厳密な名前がありません

リンクされた記事が無効になった場合に備えて、手順を投稿すると役立つことがわかりました。すべての功績はHiren Kirsariaに帰属します:

  1. Visual Studio コマンド プロンプトを実行し、DLL があるディレクトリに移動します。

    For example, my DLL is located in D:/hiren/Test.dll

  2. 次に、以下のコマンドを使用してCILファイルを作成します。

    D:/hiren> ildasm /all /out=Test.il Test.dll (このコマンドはコード ライブラリを生成します)

  3. プロジェクトに署名するための新しいキーを生成します。

    D:/hiren> sn -k mykey.snk

  4. コマンドを使用してライブラリに署名しますilasm

    D:/hiren> ilasm /dll /key=mykey.snk Test.il

于 2014-06-09T21:58:15.393 に答える
6

厳密に名前が付けられたアプリでこの問題が発生し、厳密に名前が付けられていないアセンブリを参照するために変更する必要があったため、プロジェクト プロパティの [署名] セクションで [アセンブリに署名する] のチェックを外しましたが、それでも問題が発生しました。他のすべてを正しく行ったので、問題を引き起こしているのはどこかのアーティファクトでなければならないと考えました。assemblyInfo.cs ファイルから [assembly: AssemblyKeyFile("yourkeyfilename.snk")] という行を見つけて削除しました。その後、ビルドの苦情はありません。

于 2013-10-16T23:47:12.367 に答える
0

まず、ソリューション内のすべてのプロジェクトで、すべての NuGet パッケージが同じバージョンであることを確認してください。たとえば、あるプロジェクトが NLog 4.0.0.0 を参照し、別のプロジェクトが NLog 4.1.0.0 を参照することは望ましくありません。次に、NuGet パッケージを再インストールしてみてください

Update-Package -reinstall

アセンブリ A によって参照された 3 つのサード パーティ アセンブリがあり、アセンブリ B による参照に含まれていたのは 2 つだけで、これも A を参照していました。

サード パーティ アセンブリへの不足している参照は、パッケージの更新コマンドによって追加され、エラーは解消されました。

于 2019-11-15T13:19:34.223 に答える