C# 从.Net调用本机函数时,参数值出错 现在我有一个C++ DLL项目,它用于.NET ./P>中的一个较低级别的功能的包装器。
C++代码: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可以使用的
字符串测试(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){
那就请吧,那就请吧。