私はC#で動作するプロトタイプコードアプリケーションを開発していましたが、古いC++コードのクラスと関数を(インポートされたDLLの形で)使用しています。コード要件は、クラスオブジェクトをアンマネージC++ DLL(C#から)に渡して、後でC#アプリケーションで取得できるように格納/変更することです。ここで私はこれまで...C#クラスオブジェクトをC++ DLLクラスの内外に渡す
シンプルなC++ DLLクラスを持っているコードは次のとおりです。
class CClass : public CObject
{
public:
int intTest1
};
C++ DLL関数:
CClass *Holder = new CClass;
extern "C"
{
// obj always comes in with a 0 value.
__declspec(dllexport) void SetDLLObj(CClass* obj)
{
Holder = obj;
}
// obj should leave with value of Holder (from SetDLLObj).
__declspec(dllexport) void GetDLLObj(__out CClass* &obj)
{
obj = Holder;
}
}
C#クラスおよびラッパー:
[StructureLayout(LayoutKind.Sequential)]
public class CSObject
{
public int intTest2;
}
class LibWrapper
{
[DLLImport("CPPDLL.dll")]
public static extern void SetDLLObj([MarshalAs(UnmanagedType.LPStruct)]
CSObject csObj);
public static extern void GetDLLObj([MarshalAs(UnmanagedType.LPStruct)]
ref CSObject csObj);
}
のC# DLLへの関数呼び出し:
class TestCall
{
public static void CallDLL()
{
...
CSObject objIn = new CSObject();
objIn.intTest2 = 1234; // Just so it contains something.
LibWrapper.SetDLLObj(objIn);
CSObject objOut = new CSObject();
LibWrapper.GetDLLObj(ref objOut);
MessageBox.Show(objOut.intTest2.ToString()); // This only outputs "0".
...
}
}
ジャンク値はDLL内で使用できるように見えます(渡されたC#オブジェクトからのもの)。クラスマーシャリングやメモリ/ポインタの問題で何かが欠けていると思います。私は何が欠けていますか?
編集: Bondが提案したC#/ C++のメソッド/関数定義の変更を反映するように上記のコードを変更しました。渡される値(1234)は、C#コードによって正しく取得されます。これはC++ DLLに別の問題を公開しています。 1234の値はC++コードでは使用できません。代わりに、オブジェクトはDLL内で値0を持ちます。私は定義済みのC++関数を使用してDLL内からオブジェクトを編集したいと思います。これ以上の助けをいただければ幸いです。ありがとう!あなただけのC#のクラスを使用している場合
__declspec(のdllexport){&obj; ホルダー=} あなたはそのジャンククーゼをローカルCClassの痛みポインタを無効SetDLLObj(CClassのOBJ) を得ることができますので。 – user629926
ホルダーは、後で取り出すためにC++コードに入ってくる値を格納しているように見えます。私はそれを見ることができますが、今私の主な懸念は、DLLに渡されたオブジェクトからの価値を引き出すことです。 – notsodev