gpt4 book ai didi

C# 调用 C++ DLL 返回不正确的值

转载 作者:行者123 更新时间:2023-11-28 02:01:45 25 4
gpt4 key购买 nike

我没有进一步的想法如何调试这个错误,所以寻求建议。

本质上,我有一个 C++ DLL,它有一个 bool 函数

class Point
{
Public:
double x;
double y;

// lots of operators
}

typedef struct SomeStructParent
{
bool isValid;

int64_t StartTime;
int64_t EndTime;
} SomeStructParent;

typedef struct SomeStruct : SomeStructParent
{
Point Center;
} SomeStruct;

bool func(SomeStruct & arg)
{ return some_var; }

some_var 初始化为 false。代码中唯一设置为 true 的地方有记录器打印。 func 的返回值也会定期打印到 logger。

C# 像这样导入函数:

public struct EtPoint
{
public double x;
public double y;
}

[StructLayout(LayoutKind.Sequential)]
public struct SomeStruct
{
bool isValid;

// in milliseconds using tracker epoch
public long StartTime;
long EndTime;

public EtPoint Center;
}

[DllImport("ETHAL.dll", EntryPoint = "func", CallingConvention = CallingConvention.Cdecl)]
public static extern bool func(ref SomeStruct data);

在某些情况下,从 C# 调用 func 会返回 true,即使记录器将其显示为 false - 常规打印为 false 并且显示它已设置的行不会出现。使用修改后的函数 bool funcArg(SomeStruct & arg, bool & ret) { ret = some_var; }ret 在相同条件下可靠地为 false。

也许是最烦人/最令人费解的部分:在 func 中添加调试打印时,它会返回正确的值。当我添加 Sleep(500) 时也会发生同样的情况。这让我怀疑某种多线程恶作剧,但正如我所说 - 代码中只有一个地方 some_var 被分配为真,并且在这次运行中没有达到。

C# 和 C++ 的交互是否可以解释这一点?

最佳答案

您的问题的解决方案可以是在您的声明之前进行以下编码。

[return:MarshalAs(UnmanagedType.I1)]

这可能是因为 C 将 bool 定义为 4 字节 int 而 C++ 将其定义为 1 字节。 C# 团队决定在 PInvoke 期间使用 4 字节 bool 作为默认值,因为大多数系统 API 函数使用 4 字节值作为 bool。如果要更改此行为,则必须通过指定要使用 1 字节值的编码(marshal)处理来完成。另一种解决方案是尝试将返回类型从 bool 更改为 int,这也应该可以解决问题。

有关更多信息,请查看此处提到的答案: C# DllImport with C++ boolean function not returning correctly

关于C# 调用 C++ DLL 返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39265257/

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