前沿拓展:
使用GCC生成dll文件
為什么要使用MingW呢?其實(shí)主要還是使用GCC,在Windows下主要有Mingw和Cywin,這里使用Mingw,因?yàn)镚CC在生成動(dòng)態(tài)庫,依賴項(xiàng)比較少,不像在VS生成依賴特定VC庫版本.在某些沒有VC庫對(duì)應(yīng)的版本時(shí)是無法執(zhí)行的.
這篇文章是17年寫,是因?yàn)楫?dāng)時(shí)項(xiàng)目要調(diào)用C/C++生成動(dòng)態(tài)庫(dll),因?yàn)楫?dāng)時(shí)一個(gè)同事是使用VS2015開發(fā)的,導(dǎo)致在現(xiàn)場的老機(jī)器無法直接使用.
VS2008生成dll
這里是生成c語言的動(dòng)態(tài)庫,主要是為了讓c#調(diào)用.先來一段測試代碼.
//vs編譯的話,要將函數(shù)導(dǎo)出
_declspec(dllexport) int _stdcall add(int a, int b)
{
return a + b;
}
VS2008生成dll
看一下VS2008生成dll,依賴的dll文件(VS生成dll,依賴具體某個(gè)版本vcruntime)
vs2008生成dll文件依賴項(xiàng),分別依賴msvcr90d.dll和kernel32.dll
GCC生成
不得不說,原先沒用過GCC生成dll,便在百度上進(jìn)行搜索,發(fā)現(xiàn)全是肯定.代碼還是和用VC有區(qū)別,用GCC不需要對(duì)函數(shù)進(jìn)行導(dǎo)出.
代碼如下:
int add(int a, int b)
{
return a + b;
}//注意編譯,只需要指定為*.dll 加上-shared
gcc -o callback.dll -shared main.c
GCC生成dll,依賴kernel32.dll和msvrt.dll
C#如何調(diào)用[DllImport("callback.dll", SetLastError = true)]
static extern int add(int a, int b);
private void button1_Click(object sender, EventArgs e)
{
try
{
string txt1 = textBox1.Text;
string txt2 = textBox2.Text;
int sum = add(Convert.ToInt32(txt1), Convert.ToInt32(txt2)); //調(diào)用c語言生成動(dòng)態(tài)庫中的方法
textBox3.Text = sum.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.StackTrace);
}
}
效果:
C#調(diào)用C語言生成的動(dòng)態(tài)庫
拓展知識(shí):
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http:///9183.html