dポイントプレゼントキャンペーン実施中!

お世話になります。

C#からC++のNativeコード(unmanaged)を呼び出したいと思い、C++/CLIでラッパーを作りました。

そのラッパーのクラス内で、C++で書かれたNativeコードのクラスのインスタンスを作成する時に例外が発生してしまいます。

例外はこんな感じです。

System.Runtime.InteropServices.SEHException はハンドルされませんでした。
Message="外部コンポーネントが例外をスローしました。"
Source="ManMovLib"
ErrorCode=-2147467259(0x80004005)
StackTrace:
場所 new(UInt32 )

C++/CLIは以下の様なコードで、コンストラクタ内でC++のクラスの実体を作っています。そして、このnewで例外が発生します。
AVSource::AVSource(void)
{
  m_pObj = new CAVSource;
}

C++側は、実は何もしていません。
CAVSource::CAVSource(void)
{
}

そして、色々と試行錯誤をした結果、C++側のクラスにvirtual関数があると、例外が出てしまうという事実を突き止めました。
ただ、どこを調べても、virtual関数を用いてはいけないとは書いてありません。
実際、virtualを使ってはいけないという制約があるのでしょうか?
また、何かNativeのコードを作成する際に注意点とかありますでしょうか?

ちなみに、プロジェクトの設定で、Nativeコードのデバッグを可能にするチェックをつけてデバッグ実行すると、何故かこの例外は発生せずに、全て正常に動きます。これもなぞです。

よろしくお願いします。

A 回答 (2件)

http://www.codeproject.com/KB/mcpp/quickcppcli.a …

が参考になれば幸いです。

5. Make sure you delete the native pointer in the destructor of the managed class.

とか。



http://www.amazon.com/Expert-Visual-CLI-Programm …

の Search inside this book で

CHAPTER 10 Wrapping Native Libraries
・・・
 Wapping C++ Classes
   Mapping C++ Exeptions to Managed Exceptions

とかあるのを見ると、「Nativeコードのデバッグを可能にするチェックをつけてデバッグ実行すると、」native側の例外をManaged側の例外として捕捉してくれるのかも(単なる想像ですが・・・)。

この回答への補足

ご回答有難うございます。

教えて頂いたURL見てきました。
デストラクタ内でのNativeの実体の削除は行なっていますが、例外が出ている所がnewですので、どうしたものかと。

それと、本のご紹介も有難うございました。
C++/CLIの本が出ているのですね、知りませんでした。
こちらを読み込めば、何かヒントが見つかるかもしれませんね。

補足日時:2009/05/21 10:13
    • good
    • 0
この回答へのお礼

すみません、お礼を付け忘れてしまいました。
また何かありましたら、よろしくお願いします。

お礼日時:2009/05/21 10:19

下手にラッパーを作ると、ラッパーの生成時に例外を吐くので、ラッパーを作ってはいけません。



以下のフォーラムを参考にして下さい。
http://vsug.jp/tabid/63/forumid/45/postid/2892/v …

この回答への補足

ご回答有難うございます。

フォーラムの方も見てみたのですが、いまひとつ分りません。
unmanagedのC++ライブラリをDLLにして、P/Invokeで呼び出すという事でしょうか?

ちなみに、C++/CLIでラップするという方法は、以下のサイトで知りました。
http://www.atmarkit.co.jp/fdotnet/special/vcppin …

現在、C++/CLIでラップするクラス群を作ってしまっていて、C#もその仕様に合わせて作り始めています。
出来れば、ラッパーを上手に作る方法を解説しているサイト等あれば、教えて頂ければ幸いです。

補足日時:2009/05/20 15:02
    • good
    • 0
この回答へのお礼

参考になりました。
有難うございました。

お礼日時:2009/05/21 17:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!