ここから本文です

C++で書いたクラスのDLLをC#で読み込んで使う方法を教えて下さい。

kow********さん

2015/6/2817:57:04

C++で書いたクラスのDLLをC#で読み込んで使う方法を教えて下さい。

C++で書いたクラスをC#向けにDLL化し、
C#でロードして、インスタンス化しコンストラクタを呼ぶところまでいけました。
ですが,インスタンスのメンバ関数をどう呼べばよいのかわかりません。
どうかご教授お願いします.


/////////////////////////////////////////////////////////////////////////////////
// C++ dll側(CHello.h)
/////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
class CHello
{
public:
CHello() {printf("called constructor\n")};
~CHello() {printf("called desnstructor\n")}
void func() {printf("called func\n")}
}

extern "C"
{
__declspec(dllexport) CHello* CreateInstance() {return new CHello();}
}


/////////////////////////////////////////////////////////////////////////////////
// C# load側(test.cs)
/////////////////////////////////////////////////////////////////////////////////

using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("CHello.dll", CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr CreateInstance();

static void Main(string[] args)
{
//CHelloインスタンス作成.これでコンストラクタは呼ばれる
IntPtr ptr = CreateInstance();

//CHelloクラスのfuncはどう呼べばいいでしょうか?
}
}

閲覧数:
2,740
回答数:
4
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

2015/6/2909:51:53

『C++で書いたクラスのDLL』、作り変えますよ。プロジェクトの種類は 〔Visual C++/CLR/クラスライブラリ〕とします。

CPPファイルが3本生成されますけど、『// これは メイン DLL ファイルです。』のコメントが書かれているのを開きましょう。

既に書かれてある内容はそのままにして、以下を追加します。

#include <stdio.h>
namespace Sample {
ㅤㅤpublic ref class CHello
ㅤㅤ{
ㅤㅤpublic:
ㅤㅤㅤㅤCHello() {printf("called constructor\n");};
ㅤㅤㅤㅤ~CHello() {printf("called desnstructor\n");}
ㅤㅤㅤㅤvoid func() {printf("called func\n");}
ㅤㅤ};
}

namespace の中に入れて、あと CHello クラスを public ref としただけ。基本部分は変わっていません。

ではビルドです。

C++ 側は以上です。

続きまして C# 側です。

プロジェクトのプロパティを少し変更します。〔プラットフォームターゲット:x86〕とします。デフォルトでは ANY CPU となっていますよね。

メイン関数のコードは次のようにします。

static void Main(string[] args)
{
ㅤㅤSample.CHello x = new Sample.CHello();
ㅤㅤx.func();ㅤㅤㅤㅤㅤㅤ
}


ビルドします。

終わりました。これだけですからね。簡単なものです。

  • n2q********さん

    2015/6/2909:59:20

    デストラクタについて

    ~CHello() {this->!CHello();}
    !CHello() {printf("called desnstructor\n");}

    こうしておいた方が良いです。通常、~CHello の方は呼び出されませんので。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

nao********さん

2015/6/2822:27:49

そういう場合はC++/CLIでラッピングして呼べばC#からそのまま参照設定すればCHelloを呼ぶことができます。

public ref class CHelloWrapper {
private:
CHello* nativeobject;
public:
CHelloWrapper()
{
nativeobject = new CHello(); //クラスのオブジェクトを生成
}
~CHelloWrapper()
{
this->!CHelloWrapper(); //ファイナライザを呼ぶ
}
void Func(){
nativeobject->func();
}

protected:
!CHelloWrapper()
{
delete nativeobject; //クラスのオブジェクトを解放
}
};

これをVisual C++ のクラスライブラリとしてビルドします。
CHello.hのパスも忘れずにC++のクラスは「スタティックライブラリ」として作成してlibファイルへの参照をプロジェクトから設定してください。

http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista...

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

h_o********さん

2015/6/2822:21:47

c++のクラスをc#で呼ぶときは、いったんc++/cliでラップするのが一番簡単で、一般的だと思います。
パット見た感じ、このサイトが分かりやすいです。
http://xptn.dtiblog.com/?i&no=20

簡単に言うと、c++のライブラリ資産をc#から利用することがとても難しかったために、c++とc#の間の言語仕様として生まれたのがc++/cliだったとおもいます。なので、c#とc++の橋渡しを簡単にできます。

「c# ネイティブクラス」とかで検索すると情報は豊富にあるので、参考にしてみてください。

プロフィール画像

カテゴリマスター

tre********さん

2015/6/2821:13:53

DLLを利用する為には、必ずその入り口となる関数を用意する必要があるので、クラスのポインタを受け取って、クラスのfuncを呼び出すDLL関数を追加すれば良いのではないでしょうか?

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる