gpt4 book ai didi

c# - 平台调用、 bool 值和字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:55 25 4
gpt4 key购买 nike

假设一个dll包含以下函数

extern "C" __declspec(dllexport) void f(bool x)
{
//do something
}
extern "C" __declspec(dllexport) const char* g()
{
//do something else
}

我在 C# 中使用这些函数的第一个天真的方法如下:

[DllImport("MyDll.dll")]
internal static extern void f(bool x);
[DllImport("MyDll.dll")]
internal static extern string g();

第一个惊喜是 C++ bool 没有转换为 C# bool(奇怪的运行时行为,但没有崩溃)。所以我不得不将 bool 更改为 byte 并手动从一个转换为另一个。所以,第一个问题是,有没有更好的方法来编码 bool(请注意,这是 bool,而不是 BOOL)

第二个惊喜是 dll 函数返回的原始字符串由 C# 字符串拥有,而不是像我预期的那样被复制,最终 C# 代码释放了 dll 返回的内存。我发现这个是因为程序崩溃了,但后来我将返回类型更改为 sbyte* 并使用已经执行复制的指针手动初始化字符串。所以第二个问题是:2.1:有没有更好的方法来防止编码的字符串拥有指针。 2.2:WTF?!为什么 C# 会那样做?我的意思是,一个明显的情况是 dll func 返回一个文字,而 C# 试图删除它...

提前致谢,希望我的问题不是含糊不清或难以理解。

最佳答案

[DllImport("MyDll.dll")]
internal static extern void f( [MarshalAs(UnmanagedType.I1)] bool x );
[DllImport("MyDll.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
internal static extern string g();

关于c# - 平台调用、 bool 值和字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3902126/

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