Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 平台调用、bool和字符串_C#_C++_C_Interop_Marshalling - Fatal编程技术网

C# 平台调用、bool和字符串

C# 平台调用、bool和字符串,c#,c++,c,interop,marshalling,C#,C++,C,Interop,Marshalling,假设一个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); [Dl

假设一个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(奇怪的运行时行为,但没有崩溃)。所以我不得不将布尔值改为字节,并手动从一个字节转换为另一个字节。所以,第一个问题是,有没有更好的方法来封送布尔(注意,这是布尔,不是布尔)

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


预先感谢,希望我的问题不含糊或不可理解。默认情况下,

< P> > C++ BoOL(4字节)和.NET布尔类型之间的网络封送。对于C++ BooL(单字节)类型,需要指定如何封送:

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

@达林:有趣的是,我的一个朋友跟我说了完全一样的事情,猜猜怎么着?它不起作用。我使用的是.Net1.1,如果相关的话,实际上这是1.1支持的。看这里,达林,文曾兹:我知道!我看到了那一页。试过了,但同样的错误行为还在继续。只有当我使用字节时,一切都开始工作了。。。不过还是要谢谢你,如果两个人说了同样的话,我想我一定是做错了什么……什么是错误的行为?当在C++中通过<代码>真< /COD> >你在C++中得到<代码> 0代码>代码>达林:是的,确切地说,反之亦然。我在C++中传递true,在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();