gpt4 book ai didi

关于通过 ref、空指针和 IntPtr 传递结构的互操作问题

转载 作者:行者123 更新时间:2023-12-02 00:36:09 25 4
gpt4 key购买 nike

同事们,

序言。我的问题更多是关于最佳实践。我知道一种解决方法。这是我第一次不得不在 C# 中处理互操作,同时我用 C 和 C++ 编写了大量代码。

我需要调用 2 次由非托管 DLL 公开的函数。该函数将指向结构的指针作为参数。第一次我需要传递一个 null 指针。第二次我需要传递一个指向结构实例的指针。

该函数有 6 个参数,因此下面是用于此问题的简化声明。 (如果有人感兴趣,我可以发布具体细节。)这是声明的第一个变体:

[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool foo(ref NEEDED_STRUCT_TYPE sDataStruct);

我喜欢它,因为它是 NEEDED_STRUCT_TYPE 的强类型。但是为了能够传递空指针,我必须将声明更改为

[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool foo(IntPtr sDataStruct);

现在我可以为 null 指针传递 IntPtr.Zero,但参数不再是强类型的。在给定的情况下,有没有办法同时拥有强类型参数和传递空指针的能力?

非常感谢任何建议、见解或引用!

干杯,
-尼克

最佳答案

将包装器方法与您要公开的确切 API(强类型等)结合使用,然后让该包装器方法调用私有(private)的 DllImport 方法并不少见。换句话说,原始方法没有理由需要强制托管 API。

关于关于通过 ref、空指针和 IntPtr 传递结构的互操作问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4536844/

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