C++ / CLI プリコンパイル済みヘッダー:それらはどのように機能するのでしょうか?

StackOverflow https://stackoverflow.com/questions/1104715

質問

いくつかのアンマネージ クラスを同等のマネージド クラスに置き換えるために、混合モード DLL (「クライアント」と呼びます) を作成しようとしています。私の個人用マシンではすべて正常に動作しますが、ソース コードをチェックインすると、ビルド マシンはプロジェクトをビルドしません。「Core」と呼ばれる別の DLL から使用しているマネージ クラスが認識されません。

この問題はプリコンパイルされたヘッダーに関係していると思います。その理由は次のとおりです。

「Core」のクラスを使用するために、「Client」プロジェクトに「Core」プロジェクトへの参照を追加しました。この参照を削除して、個人用マシン上でプロジェクトをビルドしても、引き続き機能します。ただし、CLR PCH は参照を削除した後は再コンパイルされません。CLR PCH を再コンパイルしてからプロジェクトをコンパイルすると、ビルド マシンで発生するのと同じエラーが発生して失敗します。マネージド クラスは認識されません。

インポートしたDLLのマネージドクラスはプリコンパイルされたヘッダーで定義されているようです。これを確認することはできませんでしたが、それが私が持っている最良の推測です。この問題に関して何か洞察できる人はいますか?混合 DLL 内のプロジェクト参照は、マネージド PCH にフックを入れることで解決されますか?

再現する手順

次のことは私にとって意味がありません。

  1. クライアントにビルドしてもらいます。
  2. クライアントからコアへの参照を削除します。クライアントをコンパイルします。クライアントはまだビルドします。これは予想外です。
  3. クライアント PCH を再コンパイルしてから、クライアントをコンパイルします。クライアントのコンパイルが失敗します:「Core」内のクラスは未定義です。これは予期された動作です。
  4. コアに参照を追加し、コンパイルします。コンパイル クライアントも同じ理由で失敗します。これは予想外です
  5. クライアント PCH を再コンパイルしてから、クライアントをコンパイルします。クライアントは正常にコンパイルされます。

この実験からの私の結論は、参照はプリコンパイルされたヘッダーを介してプロジェクトに挿入されており、少なくともこのビルド マシンでは、この動作方法に何か問題があるということです。

役に立ちましたか?

解決

C ++ / CLIで管理/混合モードのDLLへの参照を追加するための別の方法があります - それはクライアントにCore.dllを#using追加することです。これはあなたのビルドの問題を解決する可能性があります。

他のヒント

あなたがプリコンパイル済みヘッダーを使用する必要はありませんので、

それは、それはそれをすることができますように動作することはできません。
PCHが行うすべてのビルドをスピードアップすることが可能である。
これは、参照を持つ特別な何もしていません.....

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top