目前我正在使用C ++创建一个dll函数。之后,我使用DllImport
将此dll导入我的C#项目。在我的C ++项目中,我在第一个构建过程中收到了警告C4190。
Warning C4190: 'abc' has C-linkage specified, but returns UDT'std::basic_string' which is incompatible with C
我目前的代码如下:
extern "C"
{
__declspec(dllexport) std::string abc(std::string targetFile)
{
return somestring;
}
}
答案 0 :(得分:2)
C ++ Part :您不能在extern “C"
接口中使用命名空间和C ++对象。尝试使用更原始的类型,例如int
,float
,char
和指针(例如char *
)作为返回值&参数。
C#部分:您可以查看MSDN Platform Invoke Data Types进行转换。
答案 1 :(得分:0)
两种方式:
首先需要带有/clr
选项的Visual C ++编译器:
public ref struct CppLib
{
static System::String^ abc(System::String^ targetFile)
{
return gcnew System::String(somestring);
}
}
和C#看起来就像用C#编写的函数。
第二种可以使用任何语言:
extern "C"
{
__declspec(dllexport) size_t abc(const char* szTargetFile, char* szResult, size_t nResultBytes)
{
std::string targetFile(szTargetFile);
strncpy(szResult, somestring, nResultBytes);
return strlen(somestring);
}
}
要在C#中使用,您需要使用StringBuilder
来表示输出字符串的参数的p / invoke声明。
第三种方法是使用BSTR
(SysAllocString
和SysFreeString
API函数)。在C ++中有一个bstr_t
包装器。在C#中设置了一个属性,让p / invoke知道字符串是BSTR
。
重要的是,双方都同意如何分配和释放字符串。这意味着永远不要使用C ++特定于实现的分配函数,如std::string
构造函数/析构函数。