
お世話になります。
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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
が参考になれば幸いです。
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の本が出ているのですね、知りませんでした。
こちらを読み込めば、何かヒントが見つかるかもしれませんね。
No.1
- 回答日時:
下手にラッパーを作ると、ラッパーの生成時に例外を吐くので、ラッパーを作ってはいけません。
以下のフォーラムを参考にして下さい。
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#もその仕様に合わせて作り始めています。
出来れば、ラッパーを上手に作る方法を解説しているサイト等あれば、教えて頂ければ幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Excel(エクセル) 1つのファイルを3つのフォルダにファイル名を【明日の日付】にして、コピーをしたい 2 2022/12/21 17:43
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- Visual Basic(VBA) VBA 行削除した連番 4 2023/06/27 16:00
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Excel(エクセル) 【マクロ】エラーが発生⇒実行時エラー58既に同名のファイルが存在 5 2022/08/31 10:03
- その他(ソフトウェア) ソフトが異常終了します 1 2022/08/28 01:41
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MFCのドラッグ&ドロップについて
-
個々の関数について継承してい...
-
FriendとPublicの違い。。。
-
C++ データの扱い方の種類を教...
-
継承したクラスを、継承元のク...
-
イベントにAddHandlerされてい...
-
(UWSC) 「#32770」の意味わかり...
-
ポインタのキャストについて
-
ボタンのオーナードローについて
-
MFCのCListCtrlでスクロールを検出
-
visual C++ の外部クラスからの...
-
VC++ 7.1 で メインウィンドウ...
-
C++のMFCを使っています。
-
VC++6.0でテンプレートクラスを...
-
VB.NETでのEnumの使用について
-
CMainFrameクラスなどのオブジ...
-
C#のクラス設計について教えて...
-
[MFC] CWnd::MessageBoxの警告...
-
オブジェクト指向言語について
-
ダイアログ表示時にチェックボ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
ダイアログ表示時にチェックボ...
-
エディットコントロールでEnter...
-
(UWSC) 「#32770」の意味わかり...
-
C++ protectedにアクセス不可
-
クラスのアドレスを引数として...
-
エディットコントロールのイベ...
-
【ASP.NET】 独自で作成したク...
-
MFCのドラッグ&ドロップについて
-
オーバーライド関数の呼び出し...
-
C++/CLIからC++の呼び出しで例外
-
ボタンのオーナードローについて
-
C++で継承元のクラスの代入演算...
-
MFCアプリのコマンドラインでパ...
-
DLLからEXEのクラスを呼び出す...
-
MFCのCListCtrlでスクロールを検出
-
オブジェクト指向 集約の実装...
-
ダイアログクラスのコントロー...
おすすめ情報