C#作成アプリからVC++作成のDLLを使用 for VS2015 Express for Desktop
作って覚えるVisual C# 2015 デスクトップアプリ入門
- 作者: 荻原裕之,宮崎昭世
- 出版社/メーカー: 秀和システム
- 発売日: 2016/01/29
- メディア: 単行本
- この商品を含むブログ (1件) を見る
さて、前回
コマンドラインで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フォルダを作成しました。
VC++側
コマンドラインでC#からVC++作成のDLLを使用 for VS21015 Express for Desktop
mydll.cpp
#ifdef __cplusplus
using namespace std;
//整数値を返す
//文字列の参照値渡し
「開発者コマンドプロント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ビットのままだとエラーとなります。
メニュウ>プロパティ>ビルド で確認。
なので、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
これで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に表示されているのがわかると思います。
いかがですか?出来ましたでしょうか?
こなれてくると、修正したDLLの移動が面倒になってきますよね。
その際は、メモ帳を開いて makedll.bat の名前にして
makedll.bat
のような感じにして、同じVC++側のフォルダに置きます。
copyコマンドについては、詳細はググってみてください。
/yオプションは強制上書きします。
コピー先はC#のDebugフォルダを指定して下さい。
相対パスで失敗する場合は、フルパスしてみてください。
makeファイルを利用すると、手間が省けますよね。
終わり。
- 作者: ハーバート・シルト,エディフィストラーニング株式会社矢嶋聡
- 出版社/メーカー: 翔泳社
- 発売日: 2010/12/03
- メディア: 大型本
- 購入: 5人 クリック: 55回
- この商品を含むブログ (6件) を見る
猫でもわかるC#プログラミング 第3版 (猫でもわかるプログラミング)
- 作者: 粂井康孝
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/02/27
- メディア: 単行本
- この商品を含むブログ (2件) を見る