[英]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.