none
同一ソリューション上でC#からC++を呼び出す方法 RRS feed

  • 質問

  •  

    VS2005を使い、同一のソリューション上にC# のWindowsフォームアプリとC++のクラスライブラリの二つのプロジェクトを作りました。C++で書いたメソッドをC#のフォームアプリで呼び出したいのですが、どうしたらいいでしょうか。

    C#Form1(起動時に最初に立ち上がる)のコードにusingC++の名前空間か、クラス名を呼び出すのだと思うのですが、コンパイルエラーになってしまいます。どのようにコーディングすべきでしょうか。

    また、C++のクラスのインスタンスをC#のソース上で宣言するのでしょうか。

    自分がC++で書いたメソッドはマネージドコードだと思います。C++のクラスライブラリは既存(自分が書いたものではない)のDLLを呼び出しています)。これだけでは情報が不足していましたら、それも教えてください。

    2008年5月27日 3:51

回答

  • hibari さん、こんにちは。

     

    同じソリューションの中であれば、プロジェクトを参照設定すれば使えるハズです。
    名前空間 (完全修飾名) に拘っていらっしゃるようですが、そもそも参照設定ができていないということはないでしょうか?

    2008年5月27日 9:24
  • マネージクラスとして書いてビルドできているものであれば、参照設定で追加するだけで使えるようになります。

     

    もちろん、アクセスレベルをきちんと設定すること(public)、マネージクラスとして宣言すること等が必要です。

     

    マネージクラスの一例(名前空間やメンバーは省略)

    public ref class TestClass

    {

    };

    2008年5月27日 14:31
    モデレータ
  • あ... C++/CLI (マネージ C++) とは限りませんでしたね...

    2008年5月28日 11:02
  •  はじめまして、オノデラです。

     hibari さんからの引用

    ++のクラスライブラリのプロジャクト(ClassCPP)は、「プロパティ」>「参照設定」でファームアプリ(WindowsApplication4)を参照するように設定しました。

     ん? たぶんこれ逆ですね。「WindowsApplication4」が「ClassCPP」を参照するようにしてみてください。

     

     

    2008年5月29日 3:32

すべての返信

  • hibari さん、こんにちは。

     

    同じソリューションの中であれば、プロジェクトを参照設定すれば使えるハズです。
    名前空間 (完全修飾名) に拘っていらっしゃるようですが、そもそも参照設定ができていないということはないでしょうか?

    2008年5月27日 9:24
  • マネージクラスとして書いてビルドできているものであれば、参照設定で追加するだけで使えるようになります。

     

    もちろん、アクセスレベルをきちんと設定すること(public)、マネージクラスとして宣言すること等が必要です。

     

    マネージクラスの一例(名前空間やメンバーは省略)

    public ref class TestClass

    {

    };

    2008年5月27日 14:31
    モデレータ
  • あ... C++/CLI (マネージ C++) とは限りませんでしたね...

    2008年5月28日 11:02
  • ++のクラスライブラリのプロジャクト(ClassCPP)は、「プロパティ」>「参照設定」でファームアプリ(WindowsApplication4)を参照するように設定しました。以下は「Form1.cs」のソースです。

     

    using System;

      <省略>

    using System.Windows.Forms;

    using ClaccCPP   // ①

     

    namespace WindowsApplication4

    {

    public partial class Form1 :Form

    {

    <省略>

    private void button1_Click(objrct sender,EventArgs e)

    {

                                Class1 obj = new Class1( );  // ②

                                textBox1.Text = obj.mtdTest( );  // ③

    }

    }

    }

     

    ①の「ClassCPP」はC++のクラスライブラリのプロジェクト名、および名前空間名です。②の「Class1」はC++のクラス名、③の「mtdTest( )」は「Class1」のメンバであるメソッド名です。

    このままデバッグモードでビルドすると「ClassCPP」が見つからないという旨のエラーメッセージが出力されます。①だけコメントアウトしてビルドすると、「Class1」が見つからないという旨のエラーメッセージが出力されます。

    ,,③の行をすべてコメントアウトしてビルドすると、エラーは出力されず、Form1の画面が出力されますが、もちろんC++のクラスで定義したメソッドが使えません。

    Class1」は「public ref class Class1」というようにC++のヘッダファイルで定義してあります。

    まだうまく動きませんがどうしたらいいでしょうか。ご教示よろしくお願いします。

     

     

    2008年5月29日 0:56
  •  はじめまして、オノデラです。

     hibari さんからの引用

    ++のクラスライブラリのプロジャクト(ClassCPP)は、「プロパティ」>「参照設定」でファームアプリ(WindowsApplication4)を参照するように設定しました。

     ん? たぶんこれ逆ですね。「WindowsApplication4」が「ClassCPP」を参照するようにしてみてください。

     

     

    2008年5月29日 3:32
  •  

    回答してくださったすべての方々、ありがとうございました。おかげさまでうまく動きました。
    2008年5月29日 4:33
  • こんにちは、森田です。

     

    hibariさんフォーラムのご利用ありがとうございます。
    また、問題の解消おめでとうございます!

     

    じゃんぬねっとさん、Azuleanさん的確なアドバイスありがとうございました
    また、オノデラさん最後のフォローありがとうございます!

     

    皆さんの投稿は有用な情報だと思いましたので、
    勝手ながら回答済みチェックをつけさせていただきました

    2008年6月6日 9:33