いくつかのアンマネージクラスをそれらのマネージドクラスに置き換えるために、混合モードDLLを作成しようとしています。これを「クライアント」と呼びましょう。私の個人用マシンではすべて正常に動作しますが、ソースコードをチェックインすると、ビルドマシンでプロジェクトがビルドされません。「コア」と呼ばれる別のDLLから使用しているマネージクラスを認識しません。
問題はプリコンパイル済みヘッダーに関係していると思います。理由は次のとおりです。
「Core」のクラスを使用するために、「Client」プロジェクトに「Core」プロジェクトへの参照を追加しました。この参照を削除してから、個人のマシンでプロジェクトをビルドしても、引き続き機能します。ただし、CLR PCHは、参照を削除した後は再コンパイルしません。CLR PCHを再コンパイルしてからプロジェクトをコンパイルすると、ビルドマシンで発生するのと同じエラーで失敗します。つまり、管理対象クラスが認識されません。
インポートしたDLLのマネージクラスは、プリコンパイル済みヘッダーで定義されているようです。私はこれを確認することができませんでしたが、それは私が持っている最良の推測です。誰かがこの問題について彼らが流すことができる洞察を持っていますか?混合DLLのプロジェクト参照は、管理対象PCHにフックを配置することで解決されますか?
再現する手順
以下は私には意味がありません:
- クライアントにビルドしてもらいます。
- クライアントからコアへの参照を削除します。クライアントをコンパイルします。クライアントはまだビルドします。これは予期されていません。
- クライアントPCHを再コンパイルしてから、クライアントをコンパイルします。クライアントのコンパイルが失敗します:「コア」のクラスは未定義です。これは予想される動作です。
- コアへの参照を追加し、コンパイルします。同じ理由でコンパイルクライアントが失敗します。これは予期されていません
- クライアントPCHを再コンパイルしてから、クライアントをコンパイルします。クライアントは正常にコンパイルされます。
この実験からの私の結論は、参照はプリコンパイル済みヘッダーを介してプロジェクトに挿入され、少なくともビルドマシンでは、これが機能する方法で何かが壊れているということです。