1

win32 DLL を動的にロードし、関数を呼び出しています。関数には参照渡しパラメーターが含まれており、パラメーターは構造体であり、メンバーとして double ポインターが含まれています。ダブル ポインター メンバーを IntPtr としてマーシャリングし、構造体パラメーターも IntPtr としてマーシャリングしました。コードのこの部分は問題ないようです。

関数呼び出し ( MethodInfo.Invoke())の後、 Marshal.PtrToStructure()IntPtr から返された構造体データを取得し、例外を取得するために使用します"Cannot evaluate expression because the code of the current method is optimized."。プロジェクトの「コードの最適化」がオフになっていることを確認しました。

以下は簡略化されたコードです。

typedef struct {
    int x;
    int** xx;
}Struct_DoubPtr
int PassOutDoubPtrStructMember(Struct_DoubPtr* ptrStructMember);

構造体を IntPtr にマーシャリングします。

var obj = Activator.CreateInstance(Type.GetType("Struct_DoubPtr"));
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(obj));

「obj」は、Marshal.StructureToPtr(obj, ptr, false); を呼び出す前に、メンバー x = 20 および xx = IntPtr で初期化されます。

IntPtr を構造体にマーシャリングします。

Type type = Type.GetType("Struct_DoubPtr");
var newObj = Activator.CreateInstance(type);
FieldInfo[] fields = type.GetFields();
foreach (FieldInfo field in fields)
{   
    //if the field is an IntPtr 
    //a seperate function iscalled here to determine if the memeber is a IntPtr
    {   
        field.SetValue(newObj, IntPtr.Zero);
    }
}
Marshal.PtrToStructure(dataPtr, newObj); 
//where dataPtr is the strcut parameter from invoking PassOutDoubPtrStructMembe()

コメント/提案は非常に役立ちます。

4

0 に答える 0