建立Win32新專案: CMathFunc
按下<完成>, 產生檔案如下, 其中 CMathFunc.cpp 和專案名稱一致
進入後在專案上按右鍵,新增一個標頭檔(.h),名字就跟專案名稱一樣
開始撰寫CMathFun.h框架如下
1: #pragma once
2: 3: #ifndef CMATHFUN_H4: #define CMATHFUN_H
5: 6: 7: 8: 9: #endif
宣告dll呼叫方法,並且定義巨集DLLEXPORT(可自行更改名字), 在方法的前面,將DLL的方法做輸出
1: #pragma once
2: 3: #ifndef CMATHFUN_H4: #define CMATHFUN_H
5: 6: 7: #define DLLEXPORT __declspec(dllexport) //定義巨集DLLEXPORT(可自行更改名字), 在方法的前面,將DLL的方法做輸出
8: 9: extern "C"{
10: 11: // Returns a + b
12: DLLEXPORT double Add(double a, double b);
13: 14: // Returns a - b
15: DLLEXPORT double Subtract(double a, double b);
16: 17: // Returns a * b
18: DLLEXPORT double Multiply(double a, double b);
19: 20: // Returns a / b
21: DLLEXPORT double Divide(double a, double b);
22: } 23: 24: #endif
再來撰寫方法內容實作部份, 撰寫在CMathFunc.cpp, 並可以定義命名空間CMathFun, 避免與其他函式庫名稱衝突
1: #include "stdafx.h"
2: #include "CMathFun.h"
3: namespace CMathFun{
4: 5: 6: 7: 8: 9: 10: }輸入方法
1: 2: #include "stdafx.h"
3: #include "CMathFun.h"
4: namespace CMathFun{
5: 6: double Add(double a, double b)
7: {8: return a + b;
9: } 10: 11: double Subtract(double a, double b)
12: {13: return a - b;
14: } 15: 16: double Multiply(double a, double b)
17: {18: return a * b;
19: } 20: 21: double Divide(double a, double b)
22: {23: if (b == 0)
24: {25: return -1;
26: } 27: 28: return a / b;
29: } 30: 31: }編譯選項記得支援clr, 否則C#加入參考時會跳出錯誤訊息
下圖為不支援clr錯誤訊息, 看得出來是因為沒有勾選 /clr 所造成的嗎? 我是看不出來啦!!!
========================================================================================================================================
新增C# Windows Form專案呼叫上面所撰寫的DLL函式庫
專案名稱: CMathFuncClient
新增人機介面如左下, 並加入參考
選擇CMathFunc.dll
開啟Form1.cs
using System.Runtime.InteropServices;
並定義C#呼叫函式, 基本上如果呼叫C版本前面需要加入static表示不需要創建一個物件去呼叫某個方法!
1: using System;
2: using System.Collections.Generic;
3: using System.ComponentModel;
4: using System.Data;
5: using System.Drawing;
6: using System.Linq;
7: using System.Text;
8: using System.Windows.Forms;
9: using System.Runtime.InteropServices;
10: 11: namespace CMathFuncClient
12: {13: public partial class Form1 : Form
14: {15: [DllImport("CMathFunc.dll", EntryPoint = "Add", CallingConvention = CallingConvention.Cdecl)]
16: static extern double Add(double a, double b);
17: [DllImport("CMathFunc.dll", EntryPoint = "Subtract", CallingConvention = CallingConvention.Cdecl)]
18: static extern double Subtract(double a, double b);
19: [DllImport("CMathFunc.dll", EntryPoint = "Multiply", CallingConvention = CallingConvention.Cdecl)]
20: static extern double Multiply(double a, double b);
21: [DllImport("CMathFunc.dll", EntryPoint = "Divide", CallingConvention = CallingConvention.Cdecl)]
22: static extern double Divide(double a, double b);
23: 24: public Form1()
25: { 26: InitializeComponent(); 27: }按下按鈕
1: private void button2_Click(object sender, EventArgs e)
2: {3: double x = Double.Parse(textBox1.Text);
4: double y = Double.Parse(textBox2.Text);
5: double z;
6: 7: z = Add(x, y); 8: label1.Text = z.ToString(); 9: z = Subtract(x, y); 10: label2.Text = z.ToString(); 11: z = Multiply(x, y); 12: label3.Text = z.ToString(); 13: z = Divide(x, y); 14: label4.Text = z.ToString(); 15: }如果正確無誤, 表示你成功利用C# Windows Form呼叫C動態函式庫(dll)
================================================================================================================
接下來, 改以C++方式包裝DLL
CppMathFunc.h
1: // CppMathFunc.h
2: #pragma once
3: namespace CppMathFunc{
4: public ref class Arithmetics
5: { 6: public:
7: // TODO: 在此加入這個類別的方法。
8: Arithmetics(){};9: double Add(double x, double y);
10: double Subtract(double a, double b);
11: double Multiply(double x, double y);
12: double Divide(double a, double b);
13: }; 14: }接下來在CppMathFunc.cpp定義方法實作內容
1: // CppMathFunc.cpp : 定義 DLL 應用程式的匯出函式。
2: //
3: 4: #include "stdafx.h"
5: #include "CppMathFunc.h"
6: 7: namespace CppMathFunc{
8: 9: double Arithmetics::Add(double x, double y)
10: {11: return x+y;
12: }13: double Arithmetics::Subtract(double a, double b)
14: {15: return a - b;
16: }17: double Arithmetics::Multiply(double x, double y)
18: {19: return x*y;
20: }21: double Arithmetics::Divide(double a, double b)
22: {23: if (b == 0)
24: {25: return -1;
26: } 27: 28: return a / b;
29: } 30: } 31: 編譯選項記得支援clr, 否則C#加入參考時會跳出錯誤訊息
========================================================================================================================================
新增C# Windows Form專案呼叫上面所撰寫的DLL函式庫
專案名稱: CppMathFuncClient
手動加入參考
選擇CppMathFunc.dll
1: using System;
2: using System.Collections.Generic;
3: using System.ComponentModel;
4: using System.Data;
5: using System.Drawing;
6: using System.Linq;
7: using System.Text;
8: using System.Windows.Forms;
9: using CppMathFunc;
10: namespace CppMathFuncClient
11: {12: public partial class Form1 : Form
13: {14: public Form1()
15: { 16: InitializeComponent(); 17: } 18: 19: private void button2_Click(object sender, EventArgs e)
20: {21: double x = Double.Parse(textBox1.Text);
22: double y = Double.Parse(textBox2.Text);
23: double z;
24: Arithmetics ar = new Arithmetics();
25: z = ar.Add(x, y); 26: label1.Text = z.ToString(); 27: z = ar.Subtract(x, y); 28: label2.Text = z.ToString(); 29: z = ar.Multiply(x, y); 30: label3.Text = z.ToString(); 31: z = ar.Divide(x, y); 32: label4.Text = z.ToString(); 33: } 34: } 35: }執行結果:























留言列表
