gpt4 book ai didi

c# - 调用非托管函数 char 返回 char *

转载 作者:太空狗 更新时间:2023-10-29 16:00:07 28 4
gpt4 key购买 nike

我在非托管 C/C++ 代码 (dll) 中有一个函数,它返回一个包含 char 数组的结构。我创建了 C# 结构以在调用该函数时接收此返回值。然后调用这个函数我得到'System.Runtime.InteropServices.MarshalDirectiveException'

这是 C 声明:

typedef struct T_SAMPLE_STRUCT {
int num;
char text[20];
} SAMPLE_STRUCT;

SAMPLE_STRUCT sampleFunction( SAMPLE_STRUCT ss );

这是 C# 声明:

struct SAMPLE_STRUCT
{
public int num;
public string text;
}

class Dllwrapper
{
[DllImport("samplecdll.dll")]
public static extern SAMPLE_STRUCT sampleFunction(SAMPLE_STRUCT ss);

}

我使用的是 1 字节的 ASCII。

有没有人有关于如何执行此操作的提示或解决方案?

最佳答案

转换 C 数组成员的技巧是使用 MarshalAs(UnmanagedType.ByValTStr)。这可用于告诉 CLR 将该数组编码为内联成员而不是普通的非内联数组。试试下面的签名。

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Ansi)]
public struct T_SAMPLE_STRUCT {

/// int
public int num;

/// char[20]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=20)]
public string text;
}

public partial class NativeMethods {

/// Return Type: SAMPLE_STRUCT->T_SAMPLE_STRUCT
///ss: SAMPLE_STRUCT->T_SAMPLE_STRUCT
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="sampleFunction")]
public static extern T_SAMPLE_STRUCT sampleFunction(T_SAMPLE_STRUCT ss) ;

}

此签名由 CodePlex 上提供的 PNovke 互操作助手 (link) 提供给您。它可以自动将大多数 PInvoke 签名从 native 代码转换为 C# 或 VB.Net。

关于c# - 调用非托管函数 char 返回 char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/793168/

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