gpt4 book ai didi

c# - 如何使用结构作为包含字符串的参数进行互操作调用

转载 作者:太空宇宙 更新时间:2023-11-03 14:13:03 24 4
gpt4 key购买 nike

我正在尝试通过互操作从 C# 调用 DLL 中的 C++ 函数。 DLL 是由其他人编写的。函数签名如下:

AXI_DLL_EXPORT int __stdcall GetFileType(StringParam *stringParam, int *fileType)

StringParam 是一个结构体,定义如下:

struct StringParam
{
int size; // 4 byte integer for the size of the string buffer
LPWSTR buff; // Pointer to a wide char buffer
}

此结构用于来回传递字符串。它可以用作输入和输出参数。结构中 size 字段的目的主要是为了将字符串返回给调用者并指示所需缓冲区的大小。如果缓冲区的大小(由调用者提供)太小而无法容纳字符串,调用者会被告知这一点,然后可以在对该函数的后续调用中提供更大的缓冲区。

在C#中我创建了一个相应的结构如下:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal struct StringParam
{
public int Size;

[MarshalAs(UnmanagedType.LPWStr)]
public string Text;

public StringParam(string text)
{
this.Text = text;
this.Size = text.Length;
}
}

我声明了 DllImport 函数调用如下:

[DllImport("Custom.dll", CharSet = CharSet.Unicode)]
public static extern int GetFileType(StringParam stringParam, out int fileType);

调用失败并出现以下错误:

对 PInvoke 函数“... GetFileType”的调用使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。

我应该如何声明结构并从 C# 调用 native 函数?

最佳答案

public static extern int GetFileType(ref StringParam stringParam, out int fileType); 

关于c# - 如何使用结构作为包含字符串的参数进行互操作调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7226416/

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