2010-12-27 5 views

答えて

3

C++ DLLを変更できる場合は、プレーンストリングバージョンをエクスポートします。それ以外の場合は、マネージC++ラッパープロジェクトをビルドし、他のC++ dllをインポートし、マネージ関数としてエクスポートして、C#コードから呼び出す必要があります。 C + +のinteropは本当に吸う。

3

私は、あなた自身のStringStreamクラスをC#で作成して、そのDLLからエクスポートされた関数を使うことができるのではないかと心配しています。あなたが言及したように、.NET Frameworkは何も同じクラスを提供しません。

最も簡単な方法は、.NET Frameworkによって提供されるStringBuilderクラスをラップしてストリームとして機能させることです。詳細な説明とサンプルコードについては、this blog postを参照してください。

MSDN Magazineでも同様の質問が回答されています。http://msdn.microsoft.com/en-us/magazine/cc163768.aspx有用なヒントやサンプルコードがあります。

11

DLLを使用してテンプレートオブジェクトをエクスポーズしないでください。

テンプレートオブジェクト(例:std::のほとんどすべて)がインライン展開されます。このようにして、DLLは実装の専用コピーを取得します。 DLLを呼び出すモジュールは、stringstreamという独自の実装も取得します。それらの間を通過すると、2つの無関係な実装をうっかり組み合わすことになります。多くのプロジェクトで、まったく同じビルド設定を使用している場合は、おそらく問題ありません。

同じコンパイラを使用していても、リリースDLLとデバッグEXEを混在させても、スタック/ヒープの破損やその他の検出が困難な問題が発生します。

これは、別のアンマネージC++ exe/dllのDLLを使用しているだけです。それから、.NETへの回線はさらに問題になります。

解決策は、DLLの境界を越えてやりとりするものにDLLのインタフェースを変更することです。 COM(例えば、IStreamを使用することができます)、またはwinapiのようなCスタイルのインターフェイスだけです。

+0

私はSTDをとるアンマネージドC++で関数をインポートしようとしたことを試み(Win32API.processRequestWithStream(String&inputString、String&outputString)at Win32API.Main() " - このエラーの原因は何でしょうか? – user186246

+1

'std :: string'は' std :: basic_string 'の' typedef'です。つまり 'stringstream'と同様にテンプレート化されています。 –

+1

そして、さまざまなスマートポインタはどうですか?これを文字通り取ると、これはDLLの境界を越えてC++を暴露してはならないということです。 –

0

ネイティブC++コードをC#のマネージコードにバインドしようとしています。これを実行する最良の方法は、C#からの呼び出しにインターフェイスを提供するマネージC++に中間層を導入することです。

0

cでラッパーdllを作成するか、その関数への親和性のある呼び出しを公開するC++を作成します。それはより良い方法です。以下のランタイムエラーC#プログラムにパラメータとして文字列となった:「未処理の例外:System.AccessViolationExceptionを:例えば

BOOL getString(TCHAR * myreturnString, DWORD *size); 
関連する問題