いくつかのグローバル関数を持つ /clr でコンパイルされた C++ マネージ dll があります。
例えば
void Managed2UnManaged(DataStructures::AAA^ elem, DataStructures::CPP::AAA* copy_elem);
これらの関数を C++ 管理コンソール アプリケーションで使用しようとすると、次のエラーが発生します。
エラー LNK2028: 未解決のトークン (0A00048C) "void __clrcall Managed2UnManaged(class DataStructures::AAA ^,class DataStructures::CPP::AAA *)" (?Managed2UnManaged@@$$FYMXP$AAVAAA@DataStructures@NextIn@@PAV1CPP@23 @@Z)
エラー LNK2019: 未解決の外部シンボル "void __clrcall Managed2UnManaged(class DataStructures::AAA ^,class DataStructures::CPP::AAA *)" (?Managed2UnManaged@@$$FYMXP$AAVAAA@DataStructures@NextIn@@PAV1CPP@23@@ Z)
コンソール アプリケーションに dll への参照を追加しましたが、それでもエラーが発生します。
__declspec(dllexport) も追加しようとしましたが、その後
エラー C3395: 'Managed2UnManaged': __declspec(dllexport) は、__clrcall 呼び出し規約を持つ関数に適用できません
__stdcall を指定すると、
エラー C4439: 'Managed2UnManaged': 署名にマネージド型を含む関数定義には、__clrcall 呼び出し規約が必要です
私はVS2012を使用しています。
hファイルには
class XXX {
public:
static void Managed2UnManaged(DataStructures::RegResult^ elem, DataStructures::CPP::RegResult* copy_elem);
};
そしてcppファイル
void XXX::Managed2UnManaged(DataStructures::RegResult^ elem, DataStructures::CPP::RegResult* copy_elem)
{
}
問題が解決しました。問題は、クラス public ref も宣言する必要があることでした。これは、ネイティブの C++ 型が非公開であるため、別の問題を引き起こしました。そのため、make_public プラグマを使用する必要がありました。皆さんありがとう。