簡體   English   中英

C#中的std :: string?

[英]std::string in C#?

我以為問題出在我的C ++函數內部,但是我嘗試了

C ++ dll中的C ++函數:

bool __declspec( dllexport ) OpenA(std::string file)
{
return true;
}

C#代碼:

[DllImport("pk2.dll")]
public static extern bool OpenA(string path);

    if (OpenA(@"E:\asdasd\"))

我發現內存損壞了,為什么?

如果我刪除了std :: string參數,則效果很好,但使用std :: string則不起作用。

std :: string和c#字符串彼此不兼容。 據我所知,就互操作而言,c#字符串對應於在c ++中傳遞char*wchar_t*
原因之一是std :: string可以有許多不同的實現,而c#不能假設您使用的是任何特定的實現。

嘗試這樣的事情:

bool __declspec( dllexport ) OpenA(const TCHAR* pFile)
{ 
   std::string filename(pFile);
   ...
   return true;
}

您還應該在DllImport屬性中指定適當的字符集(unicode / ansi)。

順便說一句,與您的編組問題無關,通常會傳遞一個std:string作為const引用:const std:string&filename。

以您嘗試的方式封送C ++ std :: string是不可能的。 您在這里真正需要做的是編寫一個包裝函數,該函數使用一個普通的舊const char*並在后台轉換為std :: string。

C ++

extern C { 
  void OpenWrapper(const WCHAR* pName) {
    std::string name = pName;
    OpenA(name);
  }
}

C#

[DllImport("pk2.dll")]
public static extern void OpenWrapper( [In] string name);

我知道這個主題有點陳舊,但對於將來的Google員工來說,這也應該有效(在C ++中不使用char *)

C#:

public static extern bool OpenA([In, MarshalAs(UnmanagedType.LPStr)] path);

C ++:

bool __declspec( dllexport ) OpenA(std::string file);

std :: wstring和System.string可以通過以下轉換兼容:

C ++:

bool func(std::wstring str, int number)
{
  BSTR tmp_str = SysAllocStringLen(str.c_str(), str.size());
  VARIANT_BOOL ret = VARIANT_FALSE;

  // call c# COM DLL
  ptr->my_com_function(tmp_str, number, &ret);

  SysFreeString(tmp_str);

  return (ret != VARIANT_FALSE) ? true : false;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM