CS⇒Win32DLLcls

Win32 で作成した DLL Class を C# から呼び出します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの説明

  1. Win32 で作成した Class を登録した DLL を C# から呼び出します。
    Win32 の DLL を、そのまま C# のプロジェクトに格納することは出来ません。
    そこで C++/CLI のマネージドモードの DLL を経由して C# から呼び出します。
  2. Win32 で HelloClass を登録した Hello.lib(Hello.dll) を作成します。
    DLL(LIB) の作成方法は、これまでのページを参照して下さい。
    Hello.lib(Hello.dll) のヘッダーファイル Hello.h です。
    //Hello.h
    class HelloClass 
    { public: 
        void HelloMsg(); 
    };
    
    Hello.lib(Hello.dll) のプログラムファイル Hello.cpp です。
    //Hello.cpp
    #include <stdio.h>
    #include "Hello.h"
    
    void HelloClass::HelloMsg()
    {
        printf("Hello DLL\n");
    }
    
  3. Hello.lib(Hello.dll) をラップして Wrapper.dll を作成するプロジェクトです。
    Visual Studio .NET を起動して「空の CLR プロジェクト」を選択します。
    プロジェクトの名前は Wrapper にして下さい。

    プロジェクトのプロパティで [構成プロパティ][全般ページ]から構成の種類をダイナミックライブラリ(.dll)に設定します。
    文字セットは「Unicode 文字セットを使用する」です。

  4. Win32 で作成した Hello.lib と Hello.h をプロジェクトのフォルダーに格納します。
    Wrapper.h と Wrapper.cpp を格納してプロジェクトに加えます。
    Hello.lib をラップしてマネージドモードの DLL を作成するヘッダーファイル Wrapper.h です。
    // Wrapper.h 
    #pragma once 
    using namespace System; 
    
    namespace Wrapper 
    { 
        public ref class Wrap 
        { 
          public: 
            HelloClass  *cls;
    
            Wrap();         //Constructor
            ~Wrap();        //Destructor
            void func(); 
        }; 
    } 
    
    マネージドモードの DLL を作成するプログラムファイル Wrapper.cpp です。
    #pragma で "Hello.lib" を組み込んでいます。
    //Wrapper.cpp 
    #include "Hello.h"
    #include "Wrapper.h" 
    #pragma comment(lib,"Hello.lib")
    using namespace System; 
    
    namespace Wrapper
    {
        Wrap::Wrap() 
        {   cls = new HelloClass();
        }
        Wrap::~Wrap() 
        {   delete cls;
        }
        void Wrap::func() 
        {   cls->HelloMsg(); 
        }
    } 
    
  5. ソリューションのビルドを実行すると Wrapper.dll が作成されます。
    これが目的の DLL ファイルです。
    Wrapper.dll を C# から呼び出す方法は C#⇒CLI/DLL を参照して下さい。
    Hello.dll が Wrapper.dll に変わっただけで、同じようにプログラム出来ます。
    Wrapper.dll の仕様です。
    プラットホームターゲット(G)から x86 を選択して下さい。
    名前 説明
    Wrapper Wrapper.dll の namespace の名前
    Wrap Object Class の名前
    void func() "Hello Function DLL\n" を印字するメソッド

GcmLcm Class

  1. 次は Win32 で作成した GcmLcm Class を登録した DLL です。
    Win32 で GcmLcm Class を登録した GcmLcm.lib(GcmLcm.dll) を作成します。
    DLL(LIB) の作成方法は、これまでのページを参照して下さい。
    GcmLcm.lib(GcmLcm.dll) のヘッダーファイル GcmLcm.h です。
    // GcmLcm.h
    class GcmLcm
    {
      public:
        int gcm(int v1, int v2);
        int lcm(int v1, int v2);
    };
    
    プログラムファイル GcmLcm.cpp です。
    // GcmLcm.cpp
    #include "GcmLcm.h"
    
    int GcmLcm::gcm(int v1, int v2)
    {   int w1,w2;
    
        w1 = v1;
        w2 = v2;
        while(w1 != w2)
        {   if (w1 > w2)    w1-= w2;
            else            w2-= w1;
        }
        return w1;
    }
    
    int GcmLcm::lcm(int v1, int v2)
    {
        return v1*v2/gcm(v1,v2);
    }
    
  2. GcmLcm.lib(GcmLcm.dll) をラップして Wrapper.dll を作成するプロジェクトです。
    Visual Studio .NET を起動して「空の CLR プロジェクト」を選択します。
    プロジェクトの名前は Wrapper にして下さい。

    プロジェクトのプロパティで [構成プロパティ][全般ページ]から構成の種類をダイナミックライブラリ(.dll)に設定します。
    文字セットは「Unicode 文字セットを使用する」です。

  3. Win32 で作成した GcmLcm.lib と GcmLcm.h をプロジェクトのフォルダーに格納します。
    Wrapper.h と Wrapper.cpp を格納してプロジェクトに加えます。
    GcmLcm.lib をラップしてマネージドモードの DLL を作成するヘッダーファイル Wrapper.h です。
    // Wrapper.h 
    #pragma once 
    using namespace System; 
    
    namespace Wrapper 
    { 
        public ref class Wrap 
        { 
          public: 
            GcmLcm  *cls;
    
            Wrap();         //Constructor
            ~Wrap();        //Destructor
            int Gcm(int v1, int v2); 
            int Lcm(int v1, int v2); 
        }; 
    } 
    
    マネージドモードの DLL を作成するプログラムファイル Wrapper.cpp です。
    #pragma で "GcmLcm.lib" を組み込んでいます。
    //Wrapper.cpp 
    #include "GcmLcm.h"
    #include "Wrapper.h" 
    #pragma comment(lib,"GcmLcm.lib")
    using namespace System; 
    
    namespace Wrapper
    {
        Wrap::Wrap() 
        {   cls = new GcmLcm();
        }
        Wrap::~Wrap() 
        {   delete cls;
        }
        int Wrap::Gcm(int v1, int v2) 
        {   return cls->gcm(v1,v2);
        }
        int Wrap::Lcm(int v1, int v2) 
        {   return cls->lcm(v1,v2);
        }
    } 
    
  4. ソリューションのビルドを実行すると Wrapper.dll が作成されます。
    これが目的の DLL ファイルです。
    Wrapper.dll を C# から呼び出す方法は C#⇒CLI/DLL を参照して下さい。
    Hello.dll が Wrapper.dll に変わっただけで、同じようにプログラム出来ます。
    Wrapper.dll の仕様です。
    プラットホームターゲット(G)から x86 を選択して下さい。
    名前 説明
    Wrapper Wrapper.dll の namespace の名前
    Wrap Object Class の名前
    int Gcm(int v1, int v2) GCM を計算するソッド
    int Lcm(int v1, int v2) LCM を計算するソッド

超初心者のプログラム入門(C/C++)