- PR -

C#からVC++6.0のライブラリを呼び出す方法(.NET 2005)

投稿者投稿内容
ふにゅ
会議室デビュー日: 2007/01/10
投稿数: 10
投稿日時: 2007-01-17 16:10
ありがとうございます。


全部をDLL化するには大変な量ですので、
必要な関数をDLL化しようと思います。

アドバイス、ありがとうございます!
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-01-17 16:49
引用:

方針が変わりまして、C++/CLIに書き換えるのではなく、
VC++6.0でDLLを作成し、それをC#側から呼び出す事になりました。



で、やっていけるのは、元の C/C++ の関数/メソッドが Windows API 並に単純なデータ型ばかりを引数にとる場合です。

関数/メソッドの引数に STL や ATL, MFC に固有の型(例えば CString 等)を使っている場合「VC++ で DLL を作った」だけでは C# からの呼び出しは不可能です。

ここを無理くり調整しても、恐ろしく使いにくいライブラリが出来上がってしまいます。

なので、既存の資産を C++/CLI でビルド出来るように調整、さらに既存資産のクラス類を .NET で扱いやすいように C++/CLI でラップする、くらいのつもりでコトに望まないと大ゴケする可能性があります。

ふにゅ
会議室デビュー日: 2007/01/10
投稿数: 10
投稿日時: 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()
{

}


この掲示板で見つけた方法とは違うので、あれ? っと思っています。
この方法で気をつけないといけない事はありますか?
よろしくお願いします。

なんか、皆さんの意見を無視して、どんどん間違った方に進んでいるような。。。。。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-01-25 12:21
引用:

使いにくいライブラリができあがってるかもしれません。。
(略)
C#からは以下の方法でC++のクラスを呼び出しています。
(略)
[System.Runtime.InteropServices.DllImport("auau")]
public static extern void debugg();



引数無しのメソッド呼び出しなんで、かわいいモンです。

ただ、元来の 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/

スキルアップ/キャリアアップ(JOB@IT)