我正在动态加载一个win32 DLL并调用一个函数。该函数包含一个按引用传递的参数,该参数是一个包含双指针作为成员的结构。我将双指针成员编组为 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));
在调用 Marshal.StructureToPtr(obj, ptr, false); 之前,“obj”被初始化为成员 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()
任何评论/建议都会有很大帮助。