gpt4 book ai didi

c# - 无法将结构从 C++ 返回到 C#

转载 作者:行者123 更新时间:2023-11-28 04:00:07 26 4
gpt4 key购买 nike

我有一个调用 native C++ dll 的 C# 程序。

C# 具有以下结构:

[StructLayout(LayoutKind.Sequential)]
public struct Phenomenon
{
[MarshalAs(UnmanagedType.U1)] public char Type;
[MarshalAs(UnmanagedType.R8)] public double Jd;
[MarshalAs(UnmanagedType.R8)] public double Loc_jd;
[MarshalAs(UnmanagedType.R8)] public double Angle;
[MarshalAs(UnmanagedType.U1)] public char Tran_dir;
[MarshalAs(UnmanagedType.I2)] public Int16 Warning;
}

C++ 程序具有以下结构定义:

   typedef struct
{
char type;
double jd;
double loc_jd;
double angle;
char tran_dir;
short int warning;
} phenomenon;

C# 程序实例化 Phenomenom 对象具有以下对 C++ 方法的调用:

Phenomenon[] phenomena = new Phenomenon[6];
short status = rsttwi_temp(phenomena);

C++ 只是更新结构并返回。这是 C++ 函数:

__declspec(dllexport) short int rsttwi_temp (phenomenon phen[1])
{
phen[0].type = 'Z';
phen[0].jd = 1.1;
phen[0].loc_jd = 2.2;
phen[0].angle = 3.3;
phen[0].tran_dir = 4.4;
phen[0].warning = '0';

return 0;
}

在 C# 程序中,当我在调用 C++ 函数后打印出结构的值时,该结构尚未更新(即它与调用 C++ 函数之前相同)。看起来 C++ 程序能够看到这些值并更新它们,但是在返回时 C# 永远看不到结构中值的更新。认为这是一个值与引用的问题,我什至尝试用 C# 程序中的类而不是结构来做到这一点。仍然没有运气。

问题:我需要什么样的编码(marshal)处理才能让被调用的 C++ 函数能够更新传递给它的实际结构?

谢谢。-格雷格·爱德华兹全沉浸式软件

最佳答案

如果不查看 C# 函数的定义,就很难理解为什么这不起作用。不过我猜它看起来像这样

[DllImport("somedll.dll")]
public static extern Int16 rsttwi_temp(Phenomenon[] array);

我在调用固定大小的 native 数组方面没有太多经验。但是您可以做的是更改 C++ 签名以采用指针而不是固定大小的数组,并将托管代码切换为通过引用传递。例如

[DllImport("somedll.dll")]
public static extern Int16 rsttwi_temp(ref Phenomenon value);

__declspec(dllexport) short int rsttwi_temp (phenomenon* phen)

关于c# - 无法将结构从 C++ 返回到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1241900/

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