C#4.0を使用してExcelアドインをコンパイルしようとしていますが、Visual Studioでプロジェクトをビルドするときにこの問題が発生し始めました。私がこの問題を以前に経験したことがないことを伝えることが重要です。何が原因でしょうか?
C#4.0を使用してExcelアドインをコンパイルしようとしていますが、Visual Studioでプロジェクトをビルドするときにこの問題が発生し始めました。私がこの問題を以前に経験したことがないことを伝えることが重要です。何が原因でしょうか?
回答:
私の推測では、厳密に名前が付けられたアセンブリを操作していません。2つのプロジェクトが同じアセンブリのわずかに異なるバージョンを参照し、より依存するプロジェクトがこれらのプロジェクトを参照する場合、このエラーが発生しました。私の場合の解決策は、.csprojファイルのアセンブリ名からキーとバージョン情報を削除し(いずれにしても関係ありません)、クリーンビルドを実行することでした。
異なるアセンブリバージョン間の変更は、それらを参照するソリューションの部分と互換性がありました。これが当てはまらない場合は、問題を解決するためにさらに作業を行う必要がある場合があります。
NuGetを使用すると、次の場合にこの状況に簡単に入ることができます。
これにより、ソリューション内の2つのプロジェクトが、そのパッケージのアセンブリの異なるバージョンを参照します。それらの1つがもう1つを参照し、ClickOnceアプリである場合、この問題が発生します。
これを修正するにupdate-package [package name]
は、Nuget Package Manager Consoleでコマンドを発行して、すべてを平等な競争条件にします。この時点で問題はなくなります。
NuGetパッケージは、やむを得ない理由がない限り、プロジェクトレベルではなくソリューションレベルで管理する必要があります。ソリューションレベルのパッケージ管理により、複数バージョンの依存関係の可能性が回避されます。管理UIを使用しているときに、[ 統合 ]タブに1つ以上のパッケージに複数のバージョンがあることが示されている場合は、それらを1つに統合することを検討してください。
この問題が発生したとき、「ClickOnceセキュリティ設定を有効にする」をオフにすることで修正しました。
メニュー:プロジェクト| 「プロジェクト名」のプロパティ... | [セキュリティ]タブ| [ClickOnceセキュリティ設定を有効にする]チェックボックス。
この回答を参照してください。
公開ページに移動し、「アプリケーションファイル」をクリックします。そこから、DLLのリストが表示されます。問題が発生しているものの発行ステータスが「必須」ではなく「含む」としてマークされていることを確認してください。
アセンブリバージョンを変更したり、エラーに示されたマネージライブラリの別のバージョンをコピーしたりした場合、以前にコンパイルされたファイルが間違ったバージョンを参照している可能性もあります。「すべて再構築」(または以前のコメントで述べたように「bin」および「obj」フォルダを削除すると)、このケースが修正されます。
キーでアセンブリに署名する必要があります。タブ署名の下のプロジェクトプロパティに移動します。
それが役立つかもしれない人のためにこの問題の私の解決策を追加します。
ClickOnceソリューションでこのエラーが発生しました。アプリは共通の「Libs」フォルダーを参照し、へのプロジェクト参照を含んでいましたFoo.dll
。Foo.dll
ソリューションのLibs\Bar.dll
どのプロジェクトも"Libs"フォルダーのの静的コピーを参照しませんでしたが、そのフォルダーの一部の参照はそうしました(つまり、私のソリューションには参照先の参照がありFoo.dll
ました)。COアプリがすべての依存関係をLibs
依存関係だけでなく、両方のコピーがプロジェクトに含まれていました。これにより、上記のエラーが発生しました。
Libs\Foo.dll
静的バージョンをサブフォルダーに移動して問題を修正しましたLibs\Fix\Foo.dll
。この変更により、ClickOnceアプリはDLLのプロジェクトバージョンのみを使用し、エラーはなくなりました。
DLLを削除し(エラーが発生した場所)、ソリューションを再構築すると問題が解決しました。ありがとう
この質問の他のすべての答えを試してみて、あなたが:
... Intellisense / ReSharperによって作成された参照は "通常の"参照であり、期待どおりのNuGet参照ではないため、NuGetの更新プロセスではプロジェクトの参照に別のバージョンのNuGetパッケージDLLがある場合があります。 t見つけて更新してください!
これを修正するには、プロジェクトAの参照を削除してから、NuGetを使用してインストールし、すべてのプロジェクトのNuGetパッケージが同じバージョンであることを確認します。(この答えで説明するように)
この問題は、ReSharper / Intellisenseがプロジェクトに参照を追加することを提案するたびに発生する可能性があります。複数の織り交ぜプロジェクトと依存関係により、追跡が困難になるため、上記の例よりもはるかに複雑になります。ReSharper / Intellisenseによって提案されている参照が実際にNuGetパッケージからのものである場合は、NuGetを使用してインストールします。
Excelアドインをpackages.configからPackageReferenceに移行した後、この問題が発生しました。この問題に関連しているようです。
以下は、ClickOnceを使用していない場合の大まかな回避策として機能します(.manifest
ファイルからすべての依存関係情報が省略されます)。
次のようなセクションを見つけます。
<!-- Include additional build rules for an Office application add-in. -->
<Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
参照.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
ました-別のフォルダーで機能するかどうかを確認しませんでした)。
GenerateApplicationManifest
要素を見つけ、その属性Dependencies="@(DependenciesForGam)"
をに変更しますDependencies=""
。
2.にあるセクションを変更して、編集した.targets
ファイルを代わりに参照します。
これは.targets
、VSに同梱されているファイルのバージョンが更新されるたびに繰り返される必要があります(または更新が取得されません)が、すぐに修正されることを願っています...
アセンブリは適切に署名されていますか?
これを確認するには、プロジェクトでAlt + Enterキーを押します(または右クリックして[プロパティ]を押します)。「署名」に移動します。[アセンブリに署名する]チェックボックスがオンになっていて、厳密な名前のキーファイルが選択されており、[署名のみ遅延]がオフになっていることを確認します。
ここで、問題に対する別のアプローチを示します。
プロジェクトを右クリックして、「プロジェクトのアンロード」オプションを選択します。プロジェクトが使用できなくなることがわかります。
使用できないプロジェクトを右クリックして、[編集]オプションを選択します。
すべてのリソースタグを含む '<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 >
メインプロジェクトがいくつかのライブラリプロジェクトを使用していて、それらを参照している場合、ライブラリプロジェクトで何かを変更するときに、プロジェクトがライブラリプロジェクトではなくアセンブリDLLファイルを参照していると、この問題が発生する可能性があります(例:クラスの名前を変更する)。
メインプロジェクトへのすべての参照を、オブジェクトブラウザーウィンドウ(ビュー->オブジェクトブラウザー)のビューで確認できます。dllファイルへの参照には、常にバージョン番号が付いています。例:TestLib [1.0.0.0]
解決策:ライブラリプロジェクトへのメインプロジェクトの現在の参照を削除し、そのライブラリプロジェクトへの参照を再度追加します。
ここでほとんどの解決策を試した後、ついにクリック1回のプロジェクトからプロジェクトへの参照を追加しました。これにより、プロジェクトがインクルードからインクルード(自動)に変更され、最終的に機能しました。
bin
とobj
フォルダーの両方をクリアして、プロジェクトを再度ビルドします。時々これはうまくいきます。