「アセンブリ '* .dll'は、必須コンポーネントとしてマークされるために、強力な署名が必要」と表示されるのはなぜですか?


266

C#4.0を使用してExcelアドインをコンパイルしようとしていますが、Visual Studioでプロジェクトをビルドするときにこの問題が発生し始めました。私がこの問題を以前に経験したことがないことを伝えることが重要です。何が原因でしょうか?


72
手っ取り早く、プロジェクトのbinobjフォルダーの両方をクリアして、プロジェクトを再度ビルドします。時々これはうまくいきます。
Jason Evans

議会に署名していますか?
Felice Pollano、2011

3
@ジェイソン、プロジェクトのクリーニングと再構築がうまくいきました。最近アセンブリに署名したばかりで、プロジェクトはビルドされましたが、公開されませんでした。
Kratz、2011

1
@Kratz-このヒントがうまくいったことを嬉しく思います:)再起動してコンピューターを修正するようなものです!
Jason Evans

これは、構成マネージャーがいくつかのプロジェクトのビルド設定をリセットしたときに発生しました(つまり、「すべて再ビルド」でビルドするように設定されていなかった)。
アラン

回答:


239

私の推測では、厳密に名前が付けられたアセンブリを操作していません。2つのプロジェクトが同じアセンブリのわずかに異なるバージョンを参照し、より依存するプロジェクトがこれらのプロジェクトを参照する場合、このエラーが発生しました。私の場合の解決策は、.csprojファイルのアセンブリ名からキーとバージョン情報を削除し(いずれにしても関係ありません)、クリーンビルドを実行することでした。

異なるアセンブリバージョン間の変更は、それらを参照するソリューションの部分と互換性がありました。これが当てはまらない場合は、問題を解決するためにさらに作業を行う必要がある場合があります。

NuGet

NuGetを使用すると、次の場合にこの状況に簡単に入ることができます。

  1. ソリューションの1つのプロジェクトにパッケージをインストールします。
  2. そのパッケージの新しいバージョンがパッケージソースにデプロイされます。
  3. 同じソリューションの別のプロジェクトにインストールします。

これにより、ソリューション内の2つのプロジェクトが、そのパッケージのアセンブリの異なるバージョンを参照します。それらの1つがもう1つを参照し、ClickOnceアプリである場合、この問題が発生します。

これを修正するにupdate-package [package name]は、Nuget Package Manager Consoleでコマンドを発行して、すべてを平等な競争条件にします。この時点で問題はなくなります。

NuGetパッケージは、やむを得ない理由がない限り、プロジェクトレベルではなくソリューションレベルで管理する必要があります。ソリューションレベルのパッケージ管理により、複数バージョンの依存関係の可能性が回避されます。管理UIを使用しているときに、[ 統合 ]タブに1つ以上のパッケージに複数のバージョンがあることが示されている場合は、それらを1つに統合することを検討してください。


7
詳細は以下のとおりです:social.msdn.microsoft.com/Forums/en/csharplanguage/thread/…。また、binobjをクリアし、(コントロール内にある場合)アセンブリバージョンを同じ値に設定する(たとえば、ビルド番号を0のままにする)と役立ちます。
キット

3
NuGetでの今日の私の経験と同じエラーを反映するために、回答の最後に少し触れました。それが誰かを助けてくれることを願っています(おそらく数ヶ月の時間で私自身も!)。
Neil Barnwell

2
このエラーにより、ポップアップが表示され続け、.csprojファイルからアセンブリ名が削除されます。その後、クリーニングにより、一貫して修正されました。ありがとう!
ScubaSteve 2013

1
上記の回答が機能せず、Intellisense / ReSharperを使用してプロジェクトの1つにNuGet参照を追加したと思われる場合は、この回答を確認してください。
David Murdoch

ソリューションには4つのプロジェクトが含まれています。プロジェクトBの 1つはクラスライブラリです。BのDLLは、残りの3つで参照されていました。他の2つのプロジェクト(CおよびD)の実行可能ファイルは、Aで参照されています。だから私はAをビルドし、非常に同じ問題を得ました。この修正は、最初の二つのプロジェクトの残りの部分を再構築することでした。そして、プロジェクト再構築修正された問題。
Vikram Singh Saini、2015年

268

この問題が発生したとき、「ClickOnceセキュリティ設定を有効にする」をオフにすることで修正しました。

メニュー:プロジェクト| 「プロジェクト名」のプロパティ... | [セキュリティ]タブ| [ClickOnceセキュリティ設定を有効にする]チェックボックス。


2
VS2012では機能しませんでした(公開中にチェックボックスが自動的に再チェックされます)。DLLはビルドプロセスにのみ必要だったので、代わりにこの回答を使用しました。stackoverflow.com/a/8123074/17713
Matthias Meid 2013

3
ClickOnceを使用する場合、このチェックボックスは、発行ウィザードでアプリケーションが発行されるたびに自動的に選択されます。詳細については、msdn.microsoft.com / en-us / library / 1sfbfyk0.aspxを参照してください
David Murdoch、

8
MSVS 2015を持っていますが、プロジェクトのプロパティの下にセキュリティタブが表示されません
ゼータ

70

この回答を参照してください。

公開ページに移動し、「アプリケーションファイル」をクリックします。そこから、DLLのリストが表示されます。問題が発生しているものの発行ステータスが「必須」ではなく「含む」としてマークされていることを確認してください。


2
exelアドインプロジェクトには、アプリケーションファイルボタンがありません。stackoverflow.com/questions/6378801/...
セルゲイクチェル

@SergeyKucher:知らなかった。更新していただきありがとうございます。あなたの質問はExcelアドインに対するものではないので、私の回答はここでも有効だと思います(winformsプロジェクトで同じエラーメッセージが表示され、この方法で解決しました)。
Otiel

私は、公開ウィザードを使用してOPのエラーが発生するまで、正常にビルドされたwinformsプロジェクトを持っています。公開ステータスを変更すると、問題が修正されました。ありがとう
クリスチャン

7
私の場合、この問題は解決され、発行ステータスがINCLUDE(auto)からINCLUDEに変更されました。とにかく、あなたの答えは、示された値を押し付けないのに役立ちました。どうもありがとうございました
Julio Nobre

22

私はこの問題を抱えていました。これは、同じアセンブリを指す多くのプロジェクトが異なるバージョンからあったために発生しました。私のソリューションのすべてのプロジェクトに同じバージョンを選択することで解決します。


13

アセンブリバージョンを変更したり、エラーに示されたマネージライブラリの別のバージョンをコピーしたりした場合、以前にコンパイルされたファイルが間違ったバージョンを参照している可能性もあります。「すべて再構築」(または以前のコメントで述べたように「bin」および「obj」フォルダを削除すると)、このケースが修正されます。


1
または単に「クリーンソリューション」
スライスされていない

「すべて再構築」は最初にクリーンを実行し、「クリーン」、次に「ビルド」と同等です。ただし、ファイルを手動でコピーしたり、タイムスタンプを変えてコピーしたりすると、「クリーン」/「再構築」機能では問題が解決せず、「bin」および「obj」フォルダを手動で削除する必要があることに注意してください。
Sogger

Excelに関連するこの問題の場合、bin / objフォルダーを削除するとうまくいきましたが、他のアプローチではうまくいきませんでした。
William Melani 2015


6

それが役立つかもしれない人のためにこの問題の私の解決策を追加します。

ClickOnceソリューションでこのエラーが発生しました。アプリは共通の「Libs」フォルダーを参照し、へのプロジェクト参照を含んでいましたFoo.dllFoo.dllソリューションのLibs\Bar.dllどのプロジェクトも"Libs"フォルダーのの静的コピーを参照しませんでしたが、そのフォルダーの一部の参照はそうしました(つまり、私のソリューションには参照先の参照がありFoo.dllました)。COアプリがすべての依存関係をLibs依存関係だけでなく、両方のコピーがプロジェクトに含まれていました。これにより、上記のエラーが発生しました。

Libs\Foo.dll静的バージョンをサブフォルダーに移動して問題を修正しましたLibs\Fix\Foo.dll。この変更により、ClickOnceアプリはDLLのプロジェクトバージョンのみを使用し、エラーはなくなりました。



6

この質問の他のすべての答えを試してみて、あなたが:

  • ソリューションに複数のプロジェクトがある
  • NuGetパッケージを参照する別のプロジェクト(プロジェクトB)を参照するプロジェクト(プロジェクトA)があります。
  • プロジェクトAでは、Intellisense / ReSharperを使用して、プロジェクトBで参照されているNuGetパッケージへの参照を取り込みました(これは、プロジェクトBのメソッドがNuGetパッケージによって提供される型を返し、そのメソッドがプロジェクトAで使用されている場合に発生する可能性があります)
  • NuGet Package Manager(またはCLI)を介してNuGetパッケージを更新しました。

... Intellisense / ReSharperによって作成された参照は "通常の"参照であり、期待どおりのNuGet参照ではないため、NuGetの更新プロセスではプロジェクトの参照に別のバージョンのNuGetパッケージDLLがある場合があります。 t見つけて更新してください!

これを修正するには、プロジェクトAの参照を削除してから、NuGetを使用してインストールし、すべてのプロジェクトのNuGetパッケージが同じバージョンであることを確認します。(この答えで説明するように


ライフプロのヒント:

この問題は、ReSharper / Intellisenseがプロジェクトに参照を追加することを提案するたびに発生する可能性があります。複数の織り交ぜプロジェクトと依存関係により、追跡が困難になるため、上記の例よりもはるかに複雑になります。ReSharper / Intellisenseによって提案されている参照が実際にNuGetパッケージからのものである場合は、NuGetを使用してインストールします。


はい、Resharperを使用して参照を追加しないでください。Resharperは、デバッグ(またはリリースモードの場合はリリース)フォルダーから参照DLLを取得します。これは、特に巨大なプロジェクトでは、多くの問題を引き起こします。
cepriego 2016年

5

これを更新した後、WindowsAPICodePackでこれが起こったとき、私はソリューションを再構築しました。

ビルド->ソリューションの再構築


4

私のソリューションに含まれるプロジェクトが多すぎて、個別に更新および実行できないため、次の方法で修正しました。

  • ソリューションを右クリックして、[ソリューションのNuGetパッケージを管理...]を選択します。
  • [更新]タブに移動します
  • 影響を受けるパッケージを見つけて更新を選択する
  • [OK]をクリックすると、パッケージのすべてのインスタンスが最新になります

4

問題のプロジェクトをアンロードして再ロードすることで解決しました。


4

アプリケーションファイルをパブリッシュしましたが、エラーをスローしたdll が「インクルード(自動)」から「インクルード」に変更したことを発見しました。これで公開できます。


4

Excelアドインをpackages.configからPackageReferenceに移行した後、この問題が発生しました。この問題に関連しているようです。

以下は、ClickOnceを使用していない場合の大まかな回避策として機能します(.manifestファイルからすべての依存関係情報が省略されます)。

  1. プロジェクトをアンロードし、.csprojを編集します
  2. 次のようなセクションを見つけます。

    <!-- Include additional build rules for an Office application add-in. -->
    <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
  3. 参照.targetsファイルの名前を変更したコピーを編集します(私の場合、ファイルは解決され、同じフォルダーにC:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targetsコピーを作成しMicrosoft.VisualStudio.Tools.Office_FIX.targetsました-別のフォルダーで機能するかどうかを確認しませんでした)。

  4. GenerateApplicationManifest要素を見つけ、その属性Dependencies="@(DependenciesForGam)"をに変更しますDependencies=""

  5. 2.にあるセクションを変更して、編集した.targetsファイルを代わりに参照します。

これは.targets、VSに同梱されているファイルのバージョンが更新されるたびに繰り返される必要があります(または更新が取得されません)が、すぐに修正されることを願っています...


2
これに追加するには、問題を修正する少し穏やかな方法は、ポイント3にあるファイルから<Target Name = "VisualStudioForApplicationsBuild">セクション全体をコピーすることです(つまり、ファイルを見つけるだけで、コピーして名前を変更しないでください)。を自分のプロジェクトの。** projファイルに追加し、ポイント4で説明したのと同じ変更を行います。これにより、プロジェクトの動作がオーバーライドされ、マシンの他の部分には影響しません。将来のVS更新で元のファイルに変更があった場合でも、プロセスを繰り返す必要がある場合があります。
アダム

3

アセンブリは適切に署名されていますか?

これを確認するには、プロジェクトでAlt + Enterキーを押します(または右クリックして[プロパティ]を押します)。「署名」に移動します。[アセンブリに署名する]チェックボックスがオンになっていて、厳密な名前のキーファイルが選択されており、[署名のみ遅延]がオフになっていることを確認します。


* .dllに署名したことはありませんが、以前は問題がありませんでした(以前にコンパイルエラーが発生していませんでした)。公開されたプロジェクトの参照プロジェクトの1つで参照されているdll、公開されたプロジェクトから直接dllを参照するための醜い解決策を見つけました、なぜ今機能するのか教えていただけますか?または、どうすれば他の方法で問題を解決できますか?ありがとう
Sergey Kucher

1
@ user520535:まあ、もしあなたが以前にライブラリーに署名したことがなければ、そうすべきです。このライブラリが署名付きアセンブリで使用できるようにする唯一の方法ではありません(署名付きアセンブリは署名なしアセンブリを呼び出すことはできません)。ただし、プラグイン/追加を処理する場合、署名なしアセンブリでの作業も非常に難しい-ins。さて、なぜそれが今ではなく以前に問題を引き起こし始めたのですか?わからない
Arseni Mourzenko

@ user520535:問題が解決した場合は、回答を受け入れるか賛成票を投じてください。
Arseni Mourzenko

3

ここで、問題に対する別のアプローチを示します。

  • プロジェクトを右クリックして、「プロジェクトのアンロード」オプションを選択します。プロジェクトが使用できなくなることがわかります。

  • 使用できないプロジェクトを右クリックして、[編集]オプションを選択します。

  • すべてのリソースタグを含む '<ItemGroup>'タグまでスクロールします。

  • エラーリストに表示されている参照に移動すると、単一のタグ(つまり< Reference Include="assemble_name_here, Version=0.0.0.0, Culture=neutral" / >)を使用していることがわかります。

  • 次のように変更します。

<Reference Include="assemble_name_here, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" >
    < Private > True < / Private >
    < HintPath > path_here\assemble_name_here.dll < / HintPath >
< / Reference >
  • 変更を保存します。使用できないプロジェクトをもう一度右クリックし、[プロジェクトの再読み込み]オプションをクリックしてビルドします。

3

これは、参照されている.dllのバージョンを変更すると発生します。すべてのアイテム、またはターゲットビルドフォルダー内の.dllを削除する必要があります。


2

同様のコンパイラエラーが発生しました。dllファイルの依存プロジェクトをソリューションに追加すると、問題は解決しました。


2

メインプロジェクトがいくつかのライブラリプロジェクトを使用していて、それらを参照している場合、ライブラリプロジェクトで何かを変更するときに、プロジェクトがライブラリプロジェクトではなくアセンブリDLLファイルを参照していると、この問題が発生する可能性があります(例:クラスの名前を変更する)。

メインプロジェクトへのすべての参照を、オブジェクトブラウザーウィンドウ(ビュー->オブジェクトブラウザー)のビューで確認できます。dllファイルへの参照には、常にバージョン番号が付いています。例:TestLib [1.0.0.0]

解決策:ライブラリプロジェクトへのメインプロジェクトの現在の参照を削除し、そのライブラリプロジェクトへの参照を再度追加します。


1

ここでほとんどの解決策を試した後、ついにクリック1回のプロジェクトからプロジェクトへの参照を追加しました。これにより、プロジェクトがインクルードからインクルード(自動)に変更され、最終的に機能しました。


1

私を助けたのは、パッケージマネージャーソリューションに移動し、問題の原因となっているインストール済みパッケージを確認したことです。複数のプロジェクトが同じパッケージで異なるバージョンを参照していることがわかりました。私は自分のニーズに基づいてそれらを調整し、うまくいきました。


0

6つのプロジェクトを含むソリューションでこれを行いました。私のプロジェクトの1つは、名前付きアセンブリをファイル参照として参照していました。他はすべてプロジェクトの参照を指していた。

通常、これらの場合は別のエラーが発生します。

私の解決策は、名前付きアセンブリを参照されている場所から削除し、再度追加することでした。私がプロジェクトに取り組むと、この問題は消えました。これを実行する前に、ソリューションをクリーンアップして、署名されているプロジェクトがないことを確認しました。

それが誰かを助けることを願っています...


0

依存関係の依存関係の不一致がある場合は、ソリューションレベルでNuGetパッケージマネージャーに移動し、[更新]タブと[統合]タブを確認して、すべてを調和させます。


0

最近この問題に遭遇しました。私の場合、別のアセンブリにNuGetパッケージがあります。私が持っていたのは、自分のアセンブリに関連付けられた同じNuGetパッケージの異なるバージョンでした。
私のソリューションは、個々のプロジェクトではなく、ソリューションでNuGetパッケージマネージャーを使用することでした。これにより、 "統合"オプションが有効になり、NuGetパッケージを必要な数のプロジェクト全体にアップグレードできるため、それらすべてが同じバージョンのアセンブリを参照します。統合を行ったところ、ビルドエラーは解消されました。


0

私はまた、一種の問題にぶつかります、私がしなければならなかったすべては、エラーを引き起こしている.dll(参照で見つけることができます)を削除して、それを再度追加することです。

魅力のように機能します。



0

パブリッシュ->アプリケーションファイル->に移動し、影響を受けるdllパブリッシュステータスを前提条件から含めて変更します!これは私のために働いた!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.