2009-05-17 16 views
6

私の問題はC++の機能の中にあると思ったが、このstd :: string in C#?

Cz ++関数をC++のdllで試してみた:

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ではうまくいきません。

+0

文字列を展開する管理対象のC++ブリッジを作成すると解決できますか? [ここ](http://stackoverflow.com/questions/267057/creating-a-mixed-mode-c-bridge-from-c-to-c)は、この件についてのSOの質問です。 – FeatureCreep

答えて

13

std :: stringとc#stringは互いに互換性がありません。私の知る限りでは、C#文字列は、interopに関する限り、char*またはwchar_t*をC++で渡すことに対応しています。
これは、std :: stringにはさまざまな実装が存在する可能性があり、特定のものを使用していると仮定することはできません。

+4

std :: stringはテンプレートでもあり、interopのための別の興味深いワームを開くことができます。 –

+1

最も適切な方法は、char *を使用してstd :: stringを作成することです。 std :: stringをC#に返す場合は、std :: stringのsize()+ 1のサイズのCoTaskMemAllocをchar *に割り当て、memcpy std :: stringのdata()をこのバッファに割り当てて返す必要があります。簡単です。注意:CoTaskMemAllocを使用する必要があります。 –

6

はこのような何かを試してみてください:

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

あなたはまた、あなたのDLLIMPORT属性に適切な文字セット(ユニコード/ ANSI)を指定する必要があります。

マーシャル問題とは無関係に、通常、const参照としてstd:stringを渡します。const std:string & filename。

+1

_UNICODEが定義されている場合、std :: stringはコンパイルに失敗します。 #ifdefを実行してstd :: wstringを使う方がいいかもしれませんし、単純に_UNICODEに応じてtstringのtypedefを作る方が良いでしょう。 –

+0

はい、十分です。 –

1

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); 
0

私はこのトピックは少し古いです知っているが、将来のGooglerのために、これはまた、(C++でchar *を使用せずに)動作するはず

のC# :

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

C++:

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

何か証明してください。 – vines

+0

どういう意味ですか?上記のコードを試してもうまくいきませんでしたか? – Nitay

+0

私はそれがうまくいくはずで、それが動作するための要件を定義する参照ページがありますか? – vines

関連する問題