gpt4 book ai didi

c# - ref 关键字和包装方法

转载 作者:行者123 更新时间:2023-11-30 15:58:54 25 4
gpt4 key购买 nike

我有一个接口(interface)、IProxy 和一个实现代理。代理的目的是包装一些调用 C 库的外部函数。对于 extern 声明,这要求使用 ref 关键字传递结构。这是一个示例:

namespace CFuncs {
[DllImport("cLibrary.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int MyCFunc(ref MyStruct result);
}

public interface IProxy { public int MyFunc(MyStruct result); }

public class Proxy : IProxy {
public int MyFunc(MyStruct result) {
return CFuncs.MyCFunc(ref result);
}
}

C 头文件中的函数声明:

int MyCFunc (MY_STRUCT* result);

typedef struct {
// some fields
} MY_STRUCT;

以及调用代码:

var proxy = new Proxy();
var result = new MyStruct();
proxy.MyFunc(result);

我的问题是我是否应该在包装器接口(interface)和实现中使用 ref,或者结构是否会由 C 函数正确填充数据?

编辑:作为示例提供的代码似乎确实有效。难道即使 C 库想要一个指针,它实际上也不会改变它吗? ref 是否是与采用指针的函数进行互操作的要求?库附带的示例 C 代码始终让调用者为其所需的结构分配内存(如果这意味着什么)。

最佳答案

.NET 使用按值调用,而且 struct 是一种值类型 - 因此,如果您希望通过外部函数更改它,它应该是 ref参数。

关于c# - ref 关键字和包装方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9380716/

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