gpt4 book ai didi

c# - PInvoke 样式传递带有成员动态指针数组的结构

转载 作者:行者123 更新时间:2023-11-30 12:49:51 25 4
gpt4 key购买 nike

似乎有多种方法可以做到这一点,但我尝试过的示例对我不起作用。

我在某处读到,使用不安全指针是获得需要指针的更复杂结构的方法。 (对不起,我没能再次找到来源)

我最近的尝试看起来像这样:

unsafe public struct ComplexStruct {
public Int32 NumSubStruct;
public SubStruct*[] arr;
}

unsafe public static extern UInt32 DLL_Call(ref ComplexStruct p);

function {
unsafe {
ComplexStruct p = new ComplexStruct();
p.NumSubStruct = 2;
p.arr= new SubStruct*[p.NumSubStruct];
SubStruct p1 = new SubStruct();
SubStruct p2 = new SubStruct();
p.arr[0] = &p1;
p.arr[1] = &p2;


testLogHandlerHandle = DLL_Call(ref p);
}
}

我收到一条错误消息,指出 SubStruct 无法编码(签名与互操作不兼容)。

是否可以在不编码(marshal)处理的情况下传递对象? (DLL 应该加载在与 C# 应用程序相同的进程空间中)。

如果不是,传递对象副本的最简单方法是什么?

注意:更改 DLL 不是问题。我隐约知道一些其他的解决方案,例如C++/CLI,但我只有相对较少的结构类型需要以这种方式传递。

编辑:一些注意事项:

  1. 数组需要动态
  2. 实际的结构有点复杂(有 4 层这样的嵌套结构)所以我认为添加它们会分散问题的注意力,但为了完整起见,以下是我在 C++ 中声明这些结构的方式:

    struct ComplexStruct {

    unsigned int NumSubStruct;

    SubStruct** arr;

    };

    struct SubStruct {

    unsigned int NumSubStruct;

    //some more datamembers here as well

    SubSubStruct** arr;

    };

(不需要额外的间接寻址,但我认为能够将 SubStruct 指针数组声明为 IntPtr 可能很有用)

最佳答案

也许像这样?

unsafe public struct ComplexStruct 
{
public Int32 NumSubStruct;
public SubStruct** arr;
}

unsafe static void Main(string[] args)
{
ComplexStruct p = new ComplexStruct();
p.NumSubStruct = 2;
SubStruct[] s = new SubStruct[p.NumSubStruct];
// no need to new here, valuetype array
s[0].value = 1;
s[1].value = 2;
fixed (SubStruct* sp = s)
fixed (SubStruct** spp = new SubStruct*[] { sp })
{
p.arr = spp;
testLogHandlerHandle = DLL_Call(ref p);
}
}

关于c# - PInvoke 样式传递带有成员动态指针数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10540668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com