警告C4190指定C-linkage

时间:2013-12-27 09:27:55

标签: c++ c dll

目前我正在使用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;
  }
}

2 个答案:

答案 0 :(得分:2)

C ++ Part :您不能在extern “C"接口中使用命名空间和C ++对象。尝试使用更原始的类型,例如intfloatchar和指针(例如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声明。

第三种方法是使用BSTRSysAllocStringSysFreeString API函数)。在C ++中有一个bstr_t包装器。在C#中设置了一个属性,让p / invoke知道字符串是BSTR

重要的是,双方都同意如何分配和释放字符串。这意味着永远不要使用C ++特定于实现的分配函数,如std::string构造函数/析构函数。