0

いくつかのグローバル関数を持つ /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 プラグマを使用する必要がありました。皆さんありがとう。

4

1 に答える 1

2

問題は、CLR がグローバル関数を許可していないことにあると思います。

関数をエクスポートするには、マネージド クラスを作成し、関数をそのクラスの静的メンバー関数として記述する必要があります。

于 2012-12-18T08:45:16.107 に答える