- - PR -
C#からVC++6.0のライブラリを呼び出す方法(.NET 2005)
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-01-17 16:10
ありがとうございます。
全部をDLL化するには大変な量ですので、 必要な関数をDLL化しようと思います。 アドバイス、ありがとうございます! | ||||
|
投稿日時: 2007-01-17 16:49
で、やっていけるのは、元の C/C++ の関数/メソッドが Windows API 並に単純なデータ型ばかりを引数にとる場合です。 関数/メソッドの引数に STL や ATL, MFC に固有の型(例えば CString 等)を使っている場合「VC++ で DLL を作った」だけでは C# からの呼び出しは不可能です。 ここを無理くり調整しても、恐ろしく使いにくいライブラリが出来上がってしまいます。 なので、既存の資産を C++/CLI でビルド出来るように調整、さらに既存資産のクラス類を .NET で扱いやすいように C++/CLI でラップする、くらいのつもりでコトに望まないと大ゴケする可能性があります。 | ||||
|
投稿日時: 2007-01-24 19:47
もしかしたら、渋木宏明(ひどり)さんのご指摘にあったとおり、
使いにくいライブラリができあがってるかもしれません。。 上からの指示で、元々.exe用に作られていたプロジェクトを、そのままDLL化しました。 そして、 C#からは以下の方法でC++のクラスを呼び出しています。 [System.Runtime.InteropServices.DllImport("auau")] public static extern void debugg(); __declspec( dllexport ) void debugg(void) { eiei * ya = new eiei; ya->Debugger(); } void eiei::Debugger() { } この掲示板で見つけた方法とは違うので、あれ? っと思っています。 この方法で気をつけないといけない事はありますか? よろしくお願いします。 なんか、皆さんの意見を無視して、どんどん間違った方に進んでいるような。。。。。 | ||||
|
投稿日時: 2007-01-25 12:21
引数無しのメソッド呼び出しなんで、かわいいモンです。 ただ、元来の C++ の実装にクラスが使われているとしても、レガシ DLL で機能公開することにすると、「DLL 関数の実装の際にクラスの存在を隠蔽する」という不合理な作業が発生してしまいます。 DLL 関数から C++ クラスのインスタンスメソッドを呼び出すために、DLL 関数の中で 毎回 C++ クラスを new するのは無駄なコスト投入です。 また、C++ クラスインスタンスが状態を保持するような場合、「DLL 関数の中で new する」という方針では破綻します。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ |