C#から、C++で作成したdll内の関数を呼び出す方法は、以下の方法で実現できました。(メッセージボックスで "10" が表示されました)
[C++側のヘッダファイル]
#ifdef CPPDLL_EXPORTS
#define CPPDLL_API __declspec(dllexport)
#else
#define CPPDLL_API __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
CPPDLL_API int fnCppDll();
#ifdef __cplusplus
} /* extern "C" */
#endif /* __cplusplus */
[C++側のソースファイル]
CPPDLL_API int fnCppDll()
{
return 10;
}
[C#側]
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
[DllImport("CppDll.dll")]
public static extern int fnCppDll();
public Form1()
{
InitializeComponent();
}
private void buttonGo_Click(object sender, EventArgs e)
{
int n = fnCppDll();
MessageBox.Show(n.ToString());
}
}
}
今回お聞きしたいのは、int型ではなく、C++側で型を定義されたクラスのオブジェクト(の参照)を返す関数を、C#側から呼び出し、それをどうやってC#で受け取るかを教えていただきたいのです。
具体的には以下のように実装してみました。
[C++側のヘッダファイル]
#ifdef CPPDLL_EXPORTS
#define CPPDLL_API __declspec(dllexport)
#else
#define CPPDLL_API __declspec(dllimport)
#endif
class CPPDLL_API CCppDll
{
public:
int data;
CCppDll(void);
};
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
CPPDLL_API CCppDll& fnCppDll(); // C#が参照渡しということで、参照を返すようにした。
#ifdef __cplusplus
} /* extern "C" */
#endif /* __cplusplus */
[C++側のソースファイル]
CPPDLL_API CCppDll& fnCppDll()
{
CCppDll* a = new CCppDll();
return *a;
}
CCppDll::CCppDll() : data(11) // メンバーは 11 で初期化
{
}
[C#側]
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApp1
{
// ビルドエラーが起きるないように、とりあえず、C++と同じ(ような)クラスを定義
public class CCppDll
{
public int data;
}
public partial class Form1 : Form
{
[DllImport("CppDll.dll")]
public static extern CCppDll fnCppDll();
public Form1()
{
InitializeComponent();
}
private void buttonGo_Click(object sender, EventArgs e)
{
int n;
CCppDll cls = fnCppDll(); // ※
n = cls.data;
MessageBox.Show(n.ToString());
}
private void buttonCancel_Click(object sender, EventArgs e)
{
Close();
}
}
}
実装しながらも、「これじゃあ、ダメだろうな。いかにもダメだな」と思った通り、上の※の部分で以下の例外が発生しました。
------- 例外(ここから) -------
マネージド デバッグ アシスタント 'FatalExecutionEngineError' : 'ランタイムの重大なエラーが発生しました。エラーのアドレスは 0xcc9ff5a2、スレッド 0x36c8 です。エラー コードは 0xc0000005 です。これは CLR のバグであるか、またはユーザー コードのアンセーフまたは確認不可能な部分にバグがある可能性があります。このバグの一般的な原因には、スタックが壊れる可能性のある COM-interop または PInvoke のユーザー マーシャリング エラーが含まれています。'
------- 例外(ここまで) -------
明らかに基本的なことが分かっていないことから起因するエラーと思われますが、具体的にどう実装すれば、正常に動きますか。(メッセージボックスで "11" を表示)
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
このQ&Aを見た人はこんなQ&Aも見ています
-
それもChatGPT!?と驚いた使用方法を教えてください
仕事やプライベートでも利用が浸透してきたChatGPTですが、こんなときに使うの!!?とびっくりしたり、これは画期的な有効活用だ!とうなった事例があれば教えてください!
-
歳とったな〜〜と思ったことは?
歳とったな〜〜〜、老いたな〜〜と思った具体的な瞬間はありますか?
-
【お題】逆襲の桃太郎
【大喜利】桃太郎が1回鬼退治に失敗したところから始まる新作昔話「リベンジオブ桃太郎」にはこんなシーンがある
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
今から楽しみな予定はありますか?
いよいよ2025年が始まりました。皆さんには、今から楽しみにしている予定はありますか?
-
C#、C++間のDLLの呼び出しについて
C言語・C++・C#
-
インスタンス参照でアクセスできない。代わりに型名?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Processingでマウスクリックで...
-
C# 親フォームで指定した値を...
-
C# 矢印キーの取得
-
C#で、あるクラスのメンバーす...
-
大量のデータを読み込んで表示...
-
Thread.sleepのInterruptedExce...
-
C言語のポインターに関する警告
-
配列にnullを代入すると、null...
-
文字列の比較
-
ループ処理の際、最後だけ","を...
-
論理演算子”||”またはの入力方法
-
System.err. printlnとSystem.o...
-
StringBufferで改ページ処理を...
-
数字を読みに変換する方法について
-
入力文字列が数字かどうかの判別
-
【C#】フォームをなめらかに移動
-
JAVA 文字色変更
-
hiddenの値が期待した値で取得...
-
エラーのStackTraceをString変...
-
javaが上手くいきません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
ボタンの複数割り当てについて
-
C#でキーイベントが発生しない...
-
C#で別のFormへ複数の値を返そ...
-
C#でのWNetAddConnection3の使...
-
C# 矢印キーの取得
-
C# DataGridView列カスタマイズ
-
C# visibleプロパティをfalseに...
-
C# WinForm のDataGridView Cel...
-
C#から、C++で作成したdll内の...
-
unityでのC++エラーの原因がわ...
-
コンボボックスを使う時の警告
-
Processingでマウスクリックで...
-
C# 半角カナの文字化けについて
-
[C#.net]スレッド化された別フ...
-
SplitContainerについて
-
C# MouseHoverを何度も呼ぶには
-
画像を順番に点滅させたい
おすすめ情報