- PR -

VC++6.0で作ったDLLのクラスをC#で利用したい

1
投稿者投稿内容
ほんちん
会議室デビュー日: 2005/03/18
投稿数: 14
投稿日時: 2005-03-22 20:06
毎度お世話になっております。
上記の件で何か情報がありましたら、書き込み願います。

VC++6.0で作ったdllexportのクラスをC#から利用したいのですが、何か方法はありませんでしょうか?
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-03-22 20:37
http://www.microsoft.com/japan/msdn/net/bda/cominterop.aspを参照

C++のクラスライブラリをdllexportでDLL化した場合、基本的に他の言語(他のコンパイラ)で生成したコードから呼び出す事は出来ません。別に.NETに限った話ではなくてね。

.NETからネィテブコードで書かれたDLLを呼び出すにはCOMを使う方法と、P/INVOKEを用いる方法があります。前者を用いるならクラスライブラリをCOMとして呼び出せるように、大幅に手を加える必要があるでしょう。後者の方法を用いるなら、非クラスなライブラリとしてインターフェースを再設計する必要があるでしょう。

元のコードがあるなら、Managed C++でCLRなDLLとして書き直すと言う方法も有効かもしれません。

_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/

[ メッセージ編集済み 編集者: 甕星 編集日時 2005-03-22 20:38 ]
ほんちん
会議室デビュー日: 2005/03/18
投稿数: 14
投稿日時: 2005-03-22 21:50
甕星様、ご返事ありがとうございます。

実は、返答メールが来なかったので、自分で解決して、今自分でスレッドを終了させようときたところです。
やはり、甕星様が言われるとおりの方法の1つ、Managed C++ DLLでUnmanaged C++ DLLをラップし、それをC#で使うことになりました。

結構多くの方から見ていただいたようなので解決した状況を大雑把に書きます。

C#で使いたいアンマネージクラスのDLL
__dllexport class Unmanage{
bool func(){...}
}

アンマネージをラップする
__gc public class Wrap
{
Unmanage* pUnmanage;
Wrap(){
pUnmanage = new Unmanage;
}
~Wrap(){
delete pUnmanage;
}
bool func(){
return pUnmanage->func();
}
}

イメージで書いたため上記のコードは正確ではありませんが、こんなかんじです。

deleteのリンクが張られていないのにあせりましたが、なんとかできました。
ちなみにdeleteのリンクは
msvcrt.lib
msvcrtd.lib
です。
まさろ
会議室デビュー日: 2005/11/01
投稿数: 2
投稿日時: 2005-11-01 21:27
こんにちは
私も同様なことを行いたいと思っており、参考にさせていただきました。

Unmanaged C++ DLLをC#で使用したいため、
Managed C++ DLLのラッパーDLLを作成しました。

しかしC#からUnmanaged C++ DLLのクラスを使用しようとすると、
ビルドはできるのですが、実行したときに以下のようなメッセージで
実行時にエラーになってしまいまいうまくいきません
----------------------
'System.IO.FileNotFoundException' のハンドルされていない例外が system.windows.forms.dll で発生しました。

追加情報 : ファイルまたはアセンブリ名 managedWrap、またはその依存関係の 1 つが見つかりませんでした。
----------------------
以下がC#からDLLを読んでいるコードの概略です。
何か情報ありましたら教えていただけますでしょうか。
よろしくお願いします。

using managedWrap;

namespace WindowsApplication1
{
public class Form1 : System.Windows.Forms.Form
{
private Wrap hoge;
private void button1_Click(object sender, System.EventArgs e)
{
hoge.func();
}
}
}

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-11-01 23:24
引用:

しかしC#からUnmanaged C++ DLLのクラスを使用しようとすると、
ビルドはできるのですが、実行したときに以下のようなメッセージで
実行時にエラーになってしまいまいうまくいきません
----------------------
'System.IO.FileNotFoundException' のハンドルされていない例外が system.windows.forms.dll で発生しました。

追加情報 : ファイルまたはアセンブリ名 managedWrap、またはその依存関係の 1 つが見つかりませんでした。
----------------------
以下がC#からDLLを読んでいるコードの概略です。
何か情報ありましたら教えていただけますでしょうか。



エラーメッセージのとおり、実行に必要なファイルが見つからないため、実行時エラーになっています。

Unmanaged C++ DLL そのものか、他に依存する DLL (例: MFC ランタイム DLL)が、適切な位置に配置されていないんじゃないでしょうか。

まさろ
会議室デビュー日: 2005/11/01
投稿数: 2
投稿日時: 2005-11-07 22:54
渋木宏明(ひどり)様

返信ありがとうございました。

DLLの位置ではなく、unmanaged C++ DLLのクラスのインスタンスを作成していませんでした。
private Wrap hoge = new Wrap();
に修正することで解決しました。

大変申し訳ありませんでした。


1

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