gpt4 book ai didi

C# 编码 native 大小的无符号整数 size_t,通过 ref/out 参数检索值

转载 作者:行者123 更新时间:2023-11-30 20:59:25 26 4
gpt4 key购买 nike

我有 C# 代码,调用从 native dll (DllImport) 导出的 C 函数。

我希望 C 代码修改从 C# 传递的 x 参数的值,并在托管代码中使用修改后的值。 C 函数必须是返回 void 的函数。 C# 代码:

uint x=0;
Func(x);

C 代码:

void Func(size_t x)
{
x=8;
}

我尝试过:

 [DllImport("1.dll")]
public static extern void Func(size_t x);

但是在 C# 调用 Func var x 后仍然是 0。我还尝试了以下 C 代码。但它也不起作用。我的错误是什么?

void Func(size_t* x)
{
x=8;
}

最佳答案

您的示例有几个问题必须解决才能使其按预期工作。首先,据我了解,您的目标是检索 C 类型 size_t 的值,该值通过参数在 C void 返回函数中设置。

通过参数检索值的第一个简单问题通过使用 C# 和 C 中的值指针或使用 C# 参数修饰符(refout),这将强制将 C# 参数作为指针和 C 中的指针传递。函数签名如下:

// Implementation with pointers
[DllImport("MyC.dll", CallingConvention = CallingConvention.Cdecl, PreserveSig = true, EntryPoint = "Func")]
public static extern unsafe void CSharpFuncPtr(UIntPtr* x);

// Implementation with parameter modifiers - ref can be raplaced by out
[DllImport("MyC.dll", CallingConvention = CallingConvention.Cdecl, PreserveSig = true, EntryPoint = "Func")]
public static extern void CSharpFuncMod(ref UIntPtr x); //

// C function implementation
void Func(size_t* x) { *x = 7; }

在编码过程中必须解决的第二个更重要的问题是使用 native 大小的无符号整数 size_t 作为 C 类型。它在 x86 架构上定义为 32 位无符号整数,在 x64 架构上定义为 64 位无符号整数(我有意跳过所有其他处理器架构)。在 .NET 类型系统中,缺少 native 大小的整数类型。解决方法是使用托管无符号指针类型 UIntPtr 来模拟托管类型系统中的 size_t

.NET 团队意识到了这一限制,并且对实现所谓的 native 整数进行了讨论和计划 - 请参阅:Support natural size data types in the CLR

[DllImport("MyC.dll", CallingConvention = CallingConvention.Cdecl, PreserveSig = true, EntryPoint = "Func")]
public static extern void CSharpFuncNativeInt(ref nuint x);

最后,表面上看起来很简单的问题毕竟没有那么简单,简单而优雅的解决方案甚至需要更改 .NET 运行时和 BCL 库。

关于C# 编码 native 大小的无符号整数 size_t,通过 ref/out 参数检索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47516505/

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