web-dev-qa-db-ja.com

「参照アセンブリに厳密な名前がありません」エラーを修正する方法

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

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

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

221
ng5000

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

  • アセンブリを動的に読み込む、または
  • サードパーティのアセンブリに署名します。

。NET-fu:署名なしアセンブリへの署名(遅延署名なし)にサードパーティアセンブリへの署名の手順があります。

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

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

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

    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が元々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
}
198
Dirk Vollmar

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

Windows Explorer でこのファイルを参照します(場所がわかるように)。

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

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

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

役に立てば幸いです。

93
MrOli3000

私はまったく同じ問題の解決策を探していましたが、チェックを外すと「アセンブリに署名」オプションが機能します:

enter image description here

(スクリーンショットはVS2010から来ることに気付くかもしれませんが、誰かの助けになることを願っています)

56
Mars Robertson

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

http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer

これが、そこにたどり着くためにフープを飛び越えなくても、サードパーティのアセンブリに署名する必要がある人を助けることを願っています。

45
BrutalDev

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

40

サードパーティのアセンブリに署名することは私のために働いた:

http://www.codeproject.com/Tips/341645/Referenced-Assembly-does-not-have-a-strong-name

EDIT:リンクされた記事が無効になった場合にステップを投稿すると役立つことがわかりました。すべてのクレジットは Hiren Khirsaria

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

    For Example my DLL is located inD:/hiren/Test.dll

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

    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

22
mateuscb

署名されていないサードパーティのアセンブリに署名する方法

  1. Visual Studioの開発者コマンドプロンプトを開きます。このツールは、Windowsプログラムで使用でき、デフォルトのWindows検索を使用して見つけることができます。
  2. プロンプトが次のツールに一度アクセスしてアクセスできることを確認します:snildasmおよびilasm
  3. Cool.Library.dllがあるフォルダーに移動します
  4. sn –k Cool.Library.snkは新しいキーペアを作成します
  5. ライブラリを逆アセンブルするにはildasm Cool.Library.dll /out:Cool.Library.il
  6. 元のライブラリをバックアップとして保持するmove Cool.Library.dll Cool.Library.unsigned.dll
  7. ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snkは、厳密な名前でライブラリを再構築します
  8. powershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"アセンブリの完全修飾名を取得します。 web.configやapp.configなどの外部構成ファイルでDLLを参照する必要がある場合、このビットが必要になります。
13

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

5
Joe

NugetでインストールしたServiceStack dllでこれを実行していました。署名済みのラベルが付いた別のDLLセットが利用可能であることが判明しました。すべての人の答えになるわけではありませんが、アセンブリの既存の署名済みバージョンを確認するだけでよい場合があります。 ServiceStack.Signed

5
Henry Crans

古い質問ですが、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
2
Jahmic

状況:ソリューション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を削除することです

1
Martin9032

私にとっての問題は、異なるバージョンでインストールされた同じNuGetパッケージが2つあることでした。

1
Demodave

"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)"

他の人のファイルまたは自分のファイルに署名することができます。

enter image description here

1
Pabinator