Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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# 从.Net调用本机函数时,参数值出错 现在我有一个C++ DLL项目,它用于.NET ./P>中的一个较低级别的功能的包装器。_C#_C++_.net - Fatal编程技术网

C# 从.Net调用本机函数时,参数值出错 现在我有一个C++ DLL项目,它用于.NET ./P>中的一个较低级别的功能的包装器。

C# 从.Net调用本机函数时,参数值出错 现在我有一个C++ DLL项目,它用于.NET ./P>中的一个较低级别的功能的包装器。,c#,c++,.net,C#,C++,.net,C++代码: 字符串测试(uint a){ coutDllImport的默认调用约定是stdcall,但C/C++中的默认调用约定通常是cdecl。您描述的症状很容易由两种语言之间的调用约定不匹配引起,因此请确保两组代码都同意使用哪种调用约定使用 同样,在一般的DLL边界上,你不能安全地传递C++ +>代码:STD::String < /Cub >(或任何其他基于类的字符串类型),而绝对不在语言之间。当跨越语言边界时,只使用便携式POD类型是非常重要的。大多数语言与C兼容,所以只使用C可以使用的

C++代码:

字符串测试(uint a){

coutDllImport
的默认调用约定是
stdcall
,但C/C++中的默认调用约定通常是
cdecl
。您描述的症状很容易由两种语言之间的调用约定不匹配引起,因此请确保两组代码都同意使用哪种调用约定使用

同样,在一般的DLL边界上,你不能安全地传递C++ +>代码:STD::String < /Cub >(或任何其他基于类的字符串类型),而绝对不在语言之间。当跨越语言边界时,只使用便携式POD类型是非常重要的。大多数语言与C兼容,所以只使用C可以使用的类型。(因此,在本例中,对字符串使用

char*
/
wchar\u t*

此外,还必须考虑内存管理问题。如何分配内存、谁负责释放内存以及如何释放内存等。在这种情况下,如果C/C++DLL返回一个
char*
字符串,并且C自动将该数据封送到本机
string
,那么C将尝试释放
char*
字符串使用
CoTaskMemFree()
,因此DLL需要使用
CoTaskMemAlloc()
分配
char*
字符串,例如:

char*\u stdcall testA(uint32\u t a){

coutDllImport
的默认调用约定是
stdcall
,但C/C++中的默认调用约定通常是
cdecl
。您描述的症状很容易由两种语言之间的调用约定不匹配引起,因此请确保两组代码都同意使用哪种调用约定使用

同样,在一般的DLL边界上,你不能安全地传递C++ +>代码:STD::String < /Cub >(或任何其他基于类的字符串类型),而绝对不在语言之间。当跨越语言边界时,只使用便携式POD类型是非常重要的。大多数语言与C兼容,所以只使用C可以使用的类型。(因此,在本例中,对字符串使用

char*
/
wchar\u t*

此外,还必须考虑内存管理问题。如何分配内存、谁负责释放内存以及如何释放内存等。在这种情况下,如果C/C++DLL返回一个
char*
字符串,并且C自动将该数据封送到本机
string
,那么C将尝试释放
char*
字符串使用
CoTaskMemFree()
,因此DLL需要使用
CoTaskMemAlloc()
分配
char*
字符串,例如:

char*\u stdcall testA(uint32\u t a){
那就请吧,那就请吧。