私は Visual Studio 2005 プロジェクト(厳密に名前が付けられています)に、弱い名前のアセンブリを追加しました。私は今エラーを受け取っています:
「参照されたアセンブリ 'xxxxxxxx'には厳密な名前がありません」
このサードパーティアセンブリに署名する必要がありますか?
このエラーを回避するには、次のいずれかを実行できます。
。NET-fu:署名なしアセンブリへの署名(遅延署名なし)にサードパーティアセンブリへの署名の手順があります。
サードパーティに署名するための基本原則は
ildasm.exe
を使用してアセンブリを逆アセンブルし、中間言語(IL)を保存します。
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が元々unsignedB.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
}
using「厳密な名前のキーを持たない」プロジェクトであるプロジェクトファイルを展開し、.snk
ファイル(.StrongNameKey)を探します。
Windows Explorer でこのファイルを参照します(場所がわかるように)。
「厳密な名前のキーを持たない」プロジェクトでVisual Studioに戻ります。
<Browse>
を先ほど見つけた.snk
ファイルにこれでうまくいくはずです。これにより、同じソリューション内の別のプロジェクト内のフォームを使用して、あるプロジェクトの問題を解決しました。
役に立てば幸いです。
私はまったく同じ問題の解決策を探していましたが、チェックを外すと「アセンブリに署名」オプションが機能します:
(スクリーンショットはVS2010から来ることに気付くかもしれませんが、誰かの助けになることを願っています)
ソースコードを持たないものや放棄されたプロジェクトを含む、アセンブリに自動的に厳密な名前を付けるツールを作成しました。回答で説明されている多くのテクニックを、既存のツールの欠陥や欠点、または日付の付いた指示なしで簡単に使用します。
http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer
これが、そこにたどり着くためにフープを飛び越えなくても、サードパーティのアセンブリに署名する必要がある人を助けることを願っています。
アセンブリも署名されていない場合は、署名されていないアセンブリを使用できます。
サードパーティのアセンブリに署名することは私のために働いた:
http://www.codeproject.com/Tips/341645/Referenced-Assembly-does-not-have-a-strong-name
EDIT:リンクされた記事が無効になった場合にステップを投稿すると役立つことがわかりました。すべてのクレジットは Hiren Khirsaria :
Visual studioコマンドプロンプトを実行し、DLLがあるディレクトリに移動します。
For Example my DLL is located in
D:/hiren/Test.dll
次に、以下のコマンドを使用してILファイルを作成します。
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
sn
ildasm
およびilasm
sn –k Cool.Library.snk
は新しいキーペアを作成しますildasm Cool.Library.dll /out:Cool.Library.il
move Cool.Library.dll Cool.Library.unsigned.dll
ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
は、厳密な名前でライブラリを再構築しますpowershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"
アセンブリの完全修飾名を取得します。 web.configやapp.configなどの外部構成ファイルでDLLを参照する必要がある場合、このビットが必要になります。厳密な名前のアプリでこの問題があり、厳密ではない名前のアセンブリを参照するために変更する必要があったため、プロジェクトプロパティの[署名]セクションで[アセンブリに署名]のチェックを外しましたが、それはstill =文句を言いました。私はそれ以外のすべてを正しく行ったので、問題を引き起こしているどこかのアーティファクトでなければならないと考えましたが、それはまさにそれでした。 assemblyInfo.csファイルから[Assembly:AssemblyKeyFile( "yourkeyfilename.snk")]という行を見つけて削除しました。その後、ビルドに関する苦情はありません。
古い質問ですが、ilmergeについてはまだ誰も言及していません。 ilmergeはMicrosoft製ですが、VSまたはSDKに同梱されていません。 here からダウンロードできます。 github リポジトリもあります。 nugetからインストールすることもできます。
PM>Install-Package ilmerge
使用するには:
ilmerge Assembly.dll /keyfile:key.snk /out:Assembly.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug
必要に応じて、sn(VSから)を使用して独自のキーファイルを生成できます。
sn -k key.snk
状況:ソリューションX、YにプロジェクトA、B、C、Dがあった
XのプロジェクトA、B、C YのプロジェクトA、C、D
プロジェクトAでプロジェクトCを使用する必要がありますが、後で使用しません。 binデバッグプロジェクトAにはC.dllがありました。
ソリューションXをコンパイルすると、すべて問題ありません(このソリューションでは参照A-> Cを削除します)が、ソリューションYではこの問題が発生します。
解決策は、プロジェクトA bin DebugのC.dllを削除することです
私にとっての問題は、異なるバージョンでインストールされた同じNuGetパッケージが2つあることでした。
"Sign the Assembly""Signing"タブの下のチェックマークを削除すると、@ Michal Stefanowが言ったように機能します。
ここに追加するのは、自分のファイルや他の人のファイルに署名する最も簡単な方法です。 「ビルド後のイベントコマンドライン」の下に次の行を追加するだけです。
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe" sign /f "$(ProjectDir)\YourPfxFileNameHere.pfx" /p YourPfxFilePasswordHere /d "Your software title here" /du http://www.yourWebsiteHere.com /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(BaseOutputPath)$(TargetFileName)"
他の人のファイルまたは自分のファイルに署名することができます。