Visual Studio 2005プロジェクト (厳密な名前が付けられています)に弱い名前のアセンブリを追加しました。私は今、エラーが発生しています:
「参照されたアセンブリ 'xxxxxxxx' には厳密な名前がありません」
このサードパーティ アセンブリに署名する必要がありますか?
Visual Studio 2005プロジェクト (厳密な名前が付けられています)に弱い名前のアセンブリを追加しました。私は今、エラーが発生しています:
「参照されたアセンブリ 'xxxxxxxx' には厳密な名前がありません」
このサードパーティ アセンブリに署名する必要がありますか?
このエラーを回避するには、次のいずれかを実行できます。
.NET-fu: Signing an Unsigned Assembly (Without Delay Signing)でサード パーティのアセンブリに署名する手順を確認できます。
サードパーティに署名するための基本原則は、
中間言語 (IL)を使用してアセンブリを逆アセンブルしildasm.exe
、保存します。
ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
アセンブリを再構築して署名します。
ilasm /dll /key=myKey.snk thirdPartyLib.il
上記の手順は、サード パーティのアセンブリ ( A.dll ) が別のライブラリ ( B.dll ) を参照している場合を除き、正常に機能します。上記のコマンドを使用して、A.dllとB.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
}
「厳密な名前キーを持たない」プロジェクトを使用しているプロジェクト ファイルを展開し、.snk
ファイル (.StrongNameKey) を探します。
Windows エクスプローラーでこのファイルをブラウズします(場所がわかるように)。
「厳密な名前のキーを持たない」プロジェクトの Visual Studio に戻り、次のことを行います。
<Browse>
、.snk
先ほど見つけたファイルにこれでうまくいくはずです。これは、同じソリューション内の別のプロジェクト内のフォームを使用して、あるプロジェクトの問題を解決しました。
お役に立てば幸いです。
ソースコードを持っていないアセンブリや放棄されたプロジェクトを含むアセンブリに自動的に厳密な名前を付けるツールを作成しました。回答で説明されている多くの手法を、既存のツールや古い指示の欠陥や欠点なしで簡単な方法で使用します。
これが、サードパーティのアセンブリに署名する必要がある人の助けになることを願っています。
アセンブリも署名されていない場合は、署名されていないアセンブリを使用できます。
サードパーティのアセンブリに署名するとうまくいきました:
リンクされた記事が無効になった場合に備えて、手順を投稿すると役立つことがわかりました。すべての功績はHiren Kirsariaに帰属します:
Visual Studio コマンド プロンプトを実行し、DLL があるディレクトリに移動します。
For example, my DLL is located in
D:/hiren/Test.dll
次に、以下のコマンドを使用してCILファイルを作成します。
D:/hiren> ildasm /all /out=Test.il Test.dll
(このコマンドはコード ライブラリを生成します)
プロジェクトに署名するための新しいキーを生成します。
D:/hiren> sn -k mykey.snk
コマンドを使用してライブラリに署名しますilasm
。
D:/hiren> ilasm /dll /key=mykey.snk Test.il
厳密に名前が付けられたアプリでこの問題が発生し、厳密に名前が付けられていないアセンブリを参照するために変更する必要があったため、プロジェクト プロパティの [署名] セクションで [アセンブリに署名する] のチェックを外しましたが、それでも問題が発生しました。他のすべてを正しく行ったので、問題を引き起こしているのはどこかのアーティファクトでなければならないと考えました。assemblyInfo.cs ファイルから [assembly: AssemblyKeyFile("yourkeyfilename.snk")] という行を見つけて削除しました。その後、ビルドの苦情はありません。
まず、ソリューション内のすべてのプロジェクトで、すべての NuGet パッケージが同じバージョンであることを確認してください。たとえば、あるプロジェクトが NLog 4.0.0.0 を参照し、別のプロジェクトが NLog 4.1.0.0 を参照することは望ましくありません。次に、NuGet パッケージを再インストールしてみてください
Update-Package -reinstall
アセンブリ A によって参照された 3 つのサード パーティ アセンブリがあり、アセンブリ B による参照に含まれていたのは 2 つだけで、これも A を参照していました。
サード パーティ アセンブリへの不足している参照は、パッケージの更新コマンドによって追加され、エラーは解消されました。