barus's diary

とても真面目なblogですにゃ

C#作成アプリからVC++作成のDLLを使用 for VS2015 Express for Desktop

 

作って覚えるVisual C# 2015 デスクトップアプリ入門

作って覚えるVisual C# 2015 デスクトップアプリ入門

 

 

さて、前回
コマンドラインでC#からVC++作成のDLLを使用 for VS21015 Express for Desktop C#とVC++


を紹介しました。この時のコードと
Windowsアプリを作成してみよう for VS2015 Express for Desktop C#
のコードをそのまま流用してC#作成のアプリケーションから
VC++作成のDLL呼び出しをしてみたいと思います。
概念は以下の感じですね。

 

  [ GUI ] ⇔ [ DLL ]
 C#で作成      VC++で作成 

 

GUI(WIndowsアプリケーション)はC#で作成し、DLLをVC++で作成します。

ここからは、GUIについての編集はエディタを大人しく使うことにします。

DLLを作成する際は、VS2015提供のエディタを使うとモッサリしているので
私は桜エディタを使用しています。有名なところは、秀丸エディタとか
他にも優秀なソフトがあるのでそちらを使うといいかもしれません。

 

 

フォルダ配置は適当でいいのですが・・

前回作成のC#のプロジェクトのフォルダをそのままコピーして、
フォルダ名を「C#helloGUI2」としました。
このフォルダに、VC++作成のmydllフォルダを作成しました。

 

f:id:hatakeka:20160912162214p:plain

 

VC++側

コマンドラインでC#からVC++作成のDLLを使用 for VS21015 Express for Desktop

mydll.cpp

 


#include <string.h>
#include <iostream>

#ifdef __cplusplus
#define DLLEXPORT extern "C" __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllexport)
#endif

using namespace std; 

//整数値を返す
DLLEXPORT int  add(int a, int b) {
    return a + b;
}

//文字列の参照値渡し
DLLEXPORT void  test_str(char *str)
{
sprintf(str, "%sだにゃん♪", str);
}

 

「開発者コマンドプロントfor2015」起動して、コマンドラインコンパイル


>cl mydll.cpp /LD /EHsc


コマンドラインでのコンパイルの仕方が分からない方は

コマンドラインでHello World! for VS2015 VC++ 

 

を見て下さい。

コンパイルの際、32Bitマシンか64Bitマシンに提供するか意識する必要があります。
切り替えるバッチファイルはインストールのデフォで以下に有ります。

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"

64ビット用にしたい場合
vcvarsall amd64

32ビット用にしたい場合
vcvarsall amd64_x86

でしたね。

コマンドラインの場合でコンパイルした際64ビットにしましたが
今回は32ビットにします。

なぜならC#の、VS2015のエディタを使うと32ビット優先になっているからです。
64ビットのままだとエラーとなります。

メニュウ>プロパティ>ビルド で確認。

 

f:id:hatakeka:20160912162617p:plain

 

 

 

なので、64BitでDLL作った方は、32Bitに切り替える必要があります。
(もしくは、C#側を代える必要がありますが、今回DLL側を代えています。)

32Bitに切り替える。
>"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64_x86

ソースの有りかに移動
>cd /d S:\plog\vs2015\C#helloGUI2\mydll

コンパイル
>cl mydll.cpp /LD /EHsc

 


S:\plog\vs2015\C#helloGUI2\mydll>cl mydll.cpp /LD /EHsc
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24213.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.
 
mydll.cpp
Microsoft (R) Incremental Linker Version 14.00.24213.1
Copyright (C) Microsoft Corporation.  All rights reserved.
 
/out:mydll.dll
/dll
/implib:mydll.lib
mydll.obj
   ライブラリ mydll.lib とオブジェクト mydll.exp を作成中

 

これでOKです。
ソースはいじっていません。

作成したmydll.dllファイルを移動させる必要がありますが
次にC#側を先にみましょう。

 

C#

Windowsアプリを作成してみよう for VS2015 Express for Desktop C#
にて作ったコードを流用し、以下のようにします。

Form1.cs

 


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

// DllImportに必要

using System.Runtime.InteropServices;

namespace C_helloGUI

{

    public partial class Form1 : Form

    {

        //数値の値渡し

        [DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]

        private extern static int add(int a, int b);

        //文字列の参照渡し

        [DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]

        private extern static void test_str(StringBuilder str);

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            //textBox1.Text = "Hello World";

            //追記部分

            int result = add(10, 3);

            Console.WriteLine("dll add = {0}", result);

            StringBuilder buff = new StringBuilder(1024);

            buff.Append("C#からの文字列");

            test_str(buff);

            Console.WriteLine("dll test_str = {0}", buff);

            textBox1.Text = buff.ToString();

        }

    }

}

 


 

これを、F5にてビルドしましょう。
するとエラーとなります。当然ですね、DLLを移動させていませんから

bin\Debug配下に、C#helloGUI.exe が出来るのでここにVC++で作成したDLLを置きます。


mydll.dll と C#helloGUI.exe を同じフォルダに配置しましたら
F5にてビルドしましょう。

Button1を押すと、DLLに渡った文字列に「だにゃん♪」が付加されて
TextBoxに表示されているのがわかると思います。

 

f:id:hatakeka:20160912163037p:plain

 

 

f:id:hatakeka:20160912163046p:plain

 

いかがですか?出来ましたでしょうか?
こなれてくると、修正したDLLの移動が面倒になってきますよね。

その際は、メモ帳を開いて makedll.bat の名前にして

makedll.bat


cl mydll.cpp /LD /EHsc
 
copy /y mydll.dll ..\C#helloGUI\bin\Debug
 

 

のような感じにして、同じVC++側のフォルダに置きます。
copyコマンドについては、詳細はググってみてください。
/yオプションは強制上書きします。

コピー先はC#のDebugフォルダを指定して下さい。
相対パスで失敗する場合は、フルパスしてみてください。

 

f:id:hatakeka:20160912163147p:plain

 

 

makeファイルを利用すると、手間が省けますよね。


終わり。

 

 

 


 

 


 

 


 

 

 

独習C# 第3版

独習C# 第3版