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()
コメント/提案は非常に役立ちます。