アンマネージドC++ DLLをインポートし、stringstream
をパラメータとする関数を呼び出したいとします。 C#では、stringstream
クラスがないので、誰も私にそのような関数をC#プログラムから呼び出す方法を教えてもらえますか?C#のstringstream型のパラメータを受け付けるC++ DLLの関数をどのように呼び出すことができますか?
答えて
C++ DLLを変更できる場合は、プレーンストリングバージョンをエクスポートします。それ以外の場合は、マネージC++ラッパープロジェクトをビルドし、他のC++ dllをインポートし、マネージ関数としてエクスポートして、C#コードから呼び出す必要があります。 C + +のinteropは本当に吸う。
私は、あなた自身のStringStream
クラスをC#で作成して、そのDLLからエクスポートされた関数を使うことができるのではないかと心配しています。あなたが言及したように、.NET Frameworkは何も同じクラスを提供しません。
最も簡単な方法は、.NET Frameworkによって提供されるStringBuilder
クラスをラップしてストリームとして機能させることです。詳細な説明とサンプルコードについては、this blog postを参照してください。
MSDN Magazineでも同様の質問が回答されています。http://msdn.microsoft.com/en-us/magazine/cc163768.aspx有用なヒントやサンプルコードがあります。
DLLを使用してテンプレートオブジェクトをエクスポーズしないでください。
テンプレートオブジェクト(例:std::
のほとんどすべて)がインライン展開されます。このようにして、DLLは実装の専用コピーを取得します。 DLLを呼び出すモジュールは、stringstream
という独自の実装も取得します。それらの間を通過すると、2つの無関係な実装をうっかり組み合わすことになります。多くのプロジェクトで、まったく同じビルド設定を使用している場合は、おそらく問題ありません。
同じコンパイラを使用していても、リリースDLLとデバッグEXEを混在させても、スタック/ヒープの破損やその他の検出が困難な問題が発生します。
これは、別のアンマネージC++ exe/dllのDLLを使用しているだけです。それから、.NETへの回線はさらに問題になります。
解決策は、DLLの境界を越えてやりとりするものにDLLのインタフェースを変更することです。 COM(例えば、IStream
を使用することができます)、またはwinapiのようなCスタイルのインターフェイスだけです。
ネイティブC++コードをC#のマネージコードにバインドしようとしています。これを実行する最良の方法は、C#からの呼び出しにインターフェイスを提供するマネージC++に中間層を導入することです。
cでラッパーdllを作成するか、その関数への親和性のある呼び出しを公開するC++を作成します。それはより良い方法です。以下のランタイムエラーC#プログラムにパラメータとして文字列となった:「未処理の例外:System.AccessViolationExceptionを:例えば
は
BOOL getString(TCHAR * myreturnString, DWORD *size);
- 1. このDLL関数をC++/Cから呼び出す方法
- 2. カスタムC#Webサーバーは同時のAjax呼び出しを受け付けることができません
- 3. 目的C、関数で関数をどのように呼び出すことができますか?
- 4. このC#バンドパスフィルタのプロセス関数をどのように呼び出すことができますか?
- 5. C DLLからC#DLLを呼び出すことはできますか?
- 6. Java Mapインターフェイスでジェネリック型パラメータの値をどのように関連付けることができますか?
- 7. どのように私はPHPからCプログラムの関数を呼び出すことができますか?
- 8. 関数を呼び出すコードのDLL名を見つけるC#
- 9. 私はどのようにC++関数のsize_t *をObjective.cosで呼び出すことができますか?
- 10. が、私はこのように、DLLから関数を呼び出していますC/C++
- 11. dll(c)exeがどの関数を呼び出すかを調べるには?
- 12. 関数呼び出しが自分の引数を受け付けない
- 13. プログラム(DLL)から呼び出すことができるC++コンパイラ
- 14. JNIが呼び出すCプログラムからC関数を呼び出すことはできますか?
- 15. Cからdll関数の呼び出しでクラッシュする#
- 16. 窓バッチ関数は、呼び出し元からパラメータ値を受け取ることができません
- 17. パラメータを持つ関数をbashでどのように呼び出すことができますか?
- 18. C++ DLLからC#関数を呼び出す
- 19. SQL Server 2008からアンマネージC/C++ DLL関数を呼び出す
- 20. C#からdll関数を呼び出すときのPInvokeStackバランスの不一致
- 21. VB6から呼び出されるC++ DLL関数の出力配列パラメータ
- 22. C#のReplaceFile関数をどのように呼び出すのですか?
- 23. JavaのC#DLLから関数を呼び出す方法は?
- 24. C++のDLLから関数を呼び出す#
- 25. CのSTLデータ型を含むC++関数を呼び出す
- 26. C#:別のスレッドのif文の型を返す関数をどのように呼び出すのですか?
- 27. DateTime.ParseExactを1回呼び出すだけで、2桁と4桁の年の両方をどのように受け入れることができますか?
- 28. どのようにDLL内の関数の記述を見つけることができますか?
- 29. "$(obj).my_function()"のように私の関数をどのように呼び出すことができますか?
- 30. C#のDLLからこのDelphi関数を呼び出す方法は?
私はSTDをとるアンマネージドC++で関数をインポートしようとしたことを試み(Win32API.processRequestWithStream(String&inputString、String&outputString)at Win32API.Main() " - このエラーの原因は何でしょうか? – user186246
'std :: string'は' std :: basic_string 'の' typedef'です。つまり 'stringstream'と同様にテンプレート化されています。 –
そして、さまざまなスマートポインタはどうですか?これを文字通り取ると、これはDLLの境界を越えてC++を暴露してはならないということです。 –