一個很簡單很簡單的教學,順便刷刷存在感。
首先,我們先來準備dll的部分 (用C寫)
[DLL]
Step1. 檔案→新增→專案→選擇VisualC++ 的Win32專案,名稱為:ForCSharpCall。
Step2. 然後→選擇dll和空專案。
Step3. 按完成。
這個時候,你可以看到的是一個全新的空專案,什麼也沒有,
然後呢,在寫Code之前,我們先來對這個專案做一些設定。
Step4. 對專案按下右鍵→Property→在General裡面,我們找到Common Language Runtime support這一個選項
我們將他改成這樣,如果說不改的話,咱們的C#就無法順利呼叫了。
Step5.開始Coding
準備一個.h檔(ForCSharpCallDefine.h)
準備一個.cpp檔 ( 去實現這幾個function的操作 ) (ForCSharpCallImplement.cpp)
接下來,我們準備一個連接檔 !!
連接檔這玩意很重要 !
連接檔這玩意很重要 !
連接檔這玩意很重要 !
因為很重要,所以我copypaste了三次 ! 為什麼重要 ?
因為連接檔這玩意是 " 連接 dll和 ui 的地方 "
少了這個,你就不能呼叫DLL。(等於自廢武功和人戰鬥一樣)。
ForExternCall.cpp
#ifdef FORCSHARPCALL_EXPORTS //同專案名稱,只是後面固定為_EXPORTS
#define FORCSHARPCALL_API __declspec(dllexport) //請注意!正確的是Export要亮起
#else
#define FORCSHARPCALL_API __declspec(dllimport)
#endif
#include "ForCSharpCallDefine.h"
//可以將class的物件宣告在外面變成全域
//Calculate cal;
extern "C" FORCSHARPCALL_API int Add(int a, int b)
{
Calculate cal;//宣告在function內,只有該function能使用
return cal.Addition(a, b);
}
extern "C" FORCSHARPCALL_API int Sub(int a, int b)
{
Calculate cal;
return cal.Subtraction(a, b);
}
extern "C" FORCSHARPCALL_API int Multi(int a, int b)
{
Calculate cal;
return cal.Multiplication(a, b);
}
extern "C" FORCSHARPCALL_API float Div(int a, int b)
{
Calculate cal;
return cal.Division(a, b);
}
以上都完成後,我們就按下建置(Ctrl+Shift+B)
-------------------------------------------------------------
這樣我們的DLL就生成拉,接下來,我們準備C#專案,
為了方便Demo,所以建了主控台應用程式 (Console Application),
然後專案名稱我們就命名為TestCSharpCallCLib_Console
這邊呢,有一個重點,就是
麻煩請自己手動寫一下,不然你會發現,你無法使用DLL
接下來就是程式碼的部分
class Program
{
[DllImport("E:/temp/ForCSharpCall.dll", EntryPoint = "Add")]
private static extern int add(int a, int b);
[DllImport("E:/temp/ForCSharpCall.dll")]
private static extern int Sub(int a, int b);
[DllImport("E:/temp/ForCSharpCall.dll", EntryPoint = "Multi")]
private static extern int mul(int a, int b);
[DllImport("E:/temp/ForCSharpCall.dll", EntryPoint = "Div")]
private static extern float div(int a, int b);
static void Main(string[] args)
{
Console.WriteLine(add(10, 20));
Console.WriteLine(Sub(10, 20));
Console.WriteLine(mul(10, 20));
Console.WriteLine(div(10, 20));
Console.ReadKey();
}
}
如此,搞定。