web-dev-qa-db-ja.com

C#プロジェクトによって呼び出されるアンマネージC ++プロジェクトへの参照を追加するにはどうすればよいですか?

1つのソリューション(the.sln)

いくつかの関数をエクスポートするネイティブDLLをコンパイルする1つのC++プロジェクト(2010年のmycppproject.vcxprojまたは2008年のmycppproject.vcproj)。デバッグでは、これはc:\ output\Debug\mycppproject_d.dllをビルドし、リリースでは、これはc:\ output\Release\mycppproject.dllをビルドします。

DLLへのPInvoke呼び出しを含む1つのC#コンソールアプリケーション(mycsharpconsole.csproj)。

すべて正常にコンパイルされます。

ビルドするときに、csharpプロジェクトからcpp DLLプロジェクトに参照を追加して、適切なファイルを適切なディレクトリから\ bin\Debugディレクトリにコピーできるようにしたいプロジェクトが組み込まれています。

IDEは、DLLが構築される場所とC#アプリケーションが構築される場所について知る必要があるすべてを知っているので、これは可能であるはずです。

Visual Studio 2010の場合:

私はcsharpプロジェクトで「依存関係...」を試し、mycppprojectへの依存関係を追加しましたが、効果はありません。

Csharpプロジェクトで「参照の追加...」を試してcppプロジェクトへの参照を追加しようとしましたが、「プロジェクト「mycppproject」のターゲットフレームワークのバージョンが現在のプロジェクトのターゲットフレームワークのバージョンより高いです」という警告メッセージが表示されます。 。この参照をプロジェクトに追加しますか?」 (はい/いいえ/キャンセル)。

「はい」をクリックすると、「mycppprojectへの参照を追加できませんでした」というエラーメッセージが表示されます。

36
WaffleSouffle

Visual Studioは、マネージC#プロジェクトからのアンマネージC++プロジェクトの参照をサポートしていませんが、MSBuildは他のプロジェクトからのプロジェクトの参照をサポートしています。

.csprojファイルを手動で編集して、プロジェクトへの参照を手動で追加できます。ファイルで、既存のProjectReference要素のセットを見つけ(または、ない場合は新しいItemGroupを追加)、次の参照を追加します。

<ProjectReference Include="..\mycpproject.csproj">
  <Project>{b402782f-de0a-41fa-b364-60612a786fb2}</Project>
  <Name>mycppproject</Name>
  <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
  <OutputItemType>Content</OutputItemType>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</ProjectReference>

ビルドを実行すると、参照により、MSBuildは最初に参照プロジェクトをビルドします。 ReferenceOutputAssembly値は、MSBuildにビルドの出力アセンブリをコピーしないように指示します(C++プロジェクトは生成しないため)が、OutputItemTypeおよびCopyToOutputDirectoryの値は、コピーするように指示します参照プロジェクトの出力フォルダーへの出力コンテンツ。

Visual Studioで参照を表示できますが、そこで参照することはほとんどできません。

この回答は、Killill Osenkovが彼のMSDNブログで解決した同様の問題に基づいています: https://blogs.msdn.Microsoft.com/kirillosenkov/2015/04/04/how-to-have-a-project -reference-without-referenceencing-the-actual-binary /

14
Paul Turner

アンマネージDLLへの参照を追加することはできません。

代わりに、ファイルをコピーするビルド後のタスクを実行する必要があります。

または、アンマネージDLLへのリンクをC#プロジェクトのファイルとして追加し、Build ActionからNoneおよびCopy to Output DirectoryCopy If Newer

36
SLaks

私は従います スラックスの2番目の答え ...

[...]管理されていないDLLへのリンクをC#プロジェクトのファイルとして追加し、ビルドアクションを[なし]に設定し、出力にコピーすることができます)新しい場合にコピーするディレクトリ

...デバッグビルドとリリースビルドを区別するために my comment が後に続きます(C#プロジェクトファイルを手動で編集する必要があるため、少し「ハッキー」であっても)

テキストエディターでC#プロジェクトのcsprojファイルを開き、「YourNativeCppProject.dll」の出現箇所をすべて検索します(「.dll」というサブフィックスなしで)。したがって、リンクとしてpdbファイルを追加した場合も、 '複数のオカレンスを検索します)。マクロを使用してインクルードパスを変更します。例:Include = "$(SolutionDir)$(ConfigurationName)\ YourNativeCppProject.dll

PS:プロパティ(F4)を見ると、リリース構成に切り替えてもデバッグのパスがVSに表示されますが、コンパイルすると、出力にコピーされたDLLがリリースバージョンであることがわかります*

18
Notoriousxl

Add Rederencesは、同じソリューションの.NETアセンブリ、.netプロジェクト、またはCOMコンポーネント(とにかくマネージャーラッパーが作成される)に対してのみ機能します。

c#コードでDLLImport しないを使用してC++ dllにアクセスするという事実は、Visual Studioが外部dllのコピー先をどこから知っているかを意味します。

DLLImportがランタイムオプションであり、実行時にDLLを探すためにパスが使用されることを想像してください。そのため、C++ DLLを自分でデプロイし、通常は同じbinフォルダーにある.netアプリケーションで使用できるようにする必要があります。

2
Davide Piras