1

我正在动态加载一个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()

任何评论/建议都会有很大帮助。

4

0 回答 0