管理されていないサードパーティライブラリ(C)があります。C ++ / CLIでラッパーを作成しようとしているので、C#からライブラリを使用できます。Cの例がいくつかありますが、管理されていないヒープと管理されているヒープをブリッジする方法がわかりません。
ライブラリ内の関数の1つが構造体を返します。これは、マネージラッパーに保持する必要があります。この構造体は、他の関数のパラメーターとして使用されます。
動作中のC-例:
library.h
typedef struct FOO_BAR_STRUCT* FOO_BAR;
DLLEXPORT FOO_BAR FooBarCreate();
Example.c
#include <library.h>
int main(int argc, char* argv[]) {
char* address = "127.0.0.1";
FOO_BAR fb = NULL;
fb = FooBarCreate();
FooBarRegister(fb, address);
}
だから私のラッパーでは、例が何をするかを再現しようとしています。問題は構造体がどのヒープにあるかであることがわかりましたが、これを解決する方法を理解することができませんでした。
C#プロジェクトで使用するためにC ++ /CLI.dllとしてコンパイルされたC++コード。
FooBarComm.h
#include <library.h>
ref class FooBarComm
{
public:
FooBarComm(char* address);
~FooBarComm();
private:
FOO_BAR fb;
};
FooBarComm.cpp
#include "FooBarComm.h"
FooBarComm::FooBarComm(char* address)
{
fb = FooBarCreate();
FooBarRegister(fb, address);
}
FooBarComm::~FooBarComm()
{
}
そして、これは失敗します。アンマネージコードからマネージクラスにFOO_BAR構造体のインスタンスを取得し、それを後の関数の引数として使用するにはどうすればよいですか。
編集:
警告で失敗しますLNK4248:未解決のtyperefトークン(0100000D)
エラーLNK2028:未解決のトークン(0A00000A) "extern" C "struct FOO_BAR_STRUCT
エラーLNK2019:未解決の外部シンボル" extern "C" struct FOO_BAR_STRUCT
問題は、ライブラリに付属しているヘッダーファイルにFOO_BAR_STRUCTの定義がないことだと思います。私はこのライブラリが嫌いになり始めています。
構造体への参照を保持するアンマネージクラスを作成し、マネージクラスからこのアンマネージクラスを参照することは賢明ですか?
「通常の」C++クラスに変更すると、別のコンパイルエラーが発生します。
FooBarComm.h
#include <library.h>
#pragma unmanaged
class FooBarComm {
...
コンパイルエラーが発生します:
エラーLNK2019:未解決の外部シンボル_FooBarCreateが参照されました
編集2:
もちろん、.libファイルへのリンクがありませんでした。