自從看了http://msdn.microsoft.com/zh-cn/library/ms173184(VS.80).aspx及http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices(VS.80).aspx 對C#與C++通用語言執行平台下是否可以互操作產生極大興趣。
第一次用C#調用C/C++產生的DLL檔案,感覺有點新奇,其實只是實現了運行在公用語言運行庫 (CLR) 的控制之外的“Unmanaged 程式碼”(運行在公用語言運行庫(CLR)的控制之中的代碼碼稱為“Managed 程式碼“)的東西,怎樣運用在託管下的非託管呢?現在給感興趣的初學者簡單地寫一個實現的全過程吧(有什麼問題千萬別笑):
1.用VS2008選擇其它語言(C++)建立一個控制台應用程式命名為Mydll1,然後選擇應用程式類型為DLL,確定
項目
在標頭檔 stdafx.h 下添加如下聲明:
#define LIBEXPORT_API extern "C" __declspec(dllexport)
LIBEXPORT_API int Add(int a, int b);
在MyDll.cpp中實現這個函數:
#include "stdafx.h"
int Add(int a,int b)
{
return a+b;
}
注意如果實現的方法是聲明在其它標頭檔中的,一定要 加#include "xxx.h" 來引用這個聲明了這個函數標頭檔。
產生MyDll.dll和MyDll.lib。
2.在Visual C# .net中引用dll檔案
建立Visual C#控制台應用程式命名為TestImportDll;
將MyDll.dll和MyDll.lib拷貝到可執行檔目錄下():
在Praogram.cs中添加引用using System.Runtime.InteropServices;
按如下方式聲明一個將要引用MyDll.dll中函數的類:
class test
{
//[DllImport("..\\..\\lib\\CppDemo.dll")]
//public static extern void Function();
//[DllImport("..\\..\\lib\\CppDemo.dll")]
//public static extern int Add(int i, int j);
[DllImport("..\\..\\Lib\\Mydll1.dll")]
public static extern int Add(int a, int b);
}
最後在Main函數中調用這個類輸出結果:
static void Main(string[] args)
{
Console.WriteLine("result: " + test.Add(2, 3).ToString());
Console.ReadLine();
}下面是Program.cs的代碼:
END():