C#如何調用一個非托管動態庫中的函數呢,比如用VC6寫的動態庫,總之C#調用動態庫的過程是比Java調用DLL動態庫方便快捷多了,下面舉例說明這個過程。
1、創建一個非托管動態庫
代碼如下:
int add( int a, int b)
{
//實現這個函數returna+b;
}
保存成C或者CPP文件都可以,接下來就用命令 cl (這個命令VC6提供) 來編譯生成一個動態庫,命令如下:
MyLib.cpp
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:MyLib.dll
/dll
/implib:MyLib.lib
MyLib.obj
Creating library MyLib.lib and object MyLib.exp
2、編寫C#程序調用動態庫
[DllImport( "MyLib.dll" , CharSet=CharSet.Auto)]
staticexternint add( int a, int b); //聲明外部的標準動態庫, 跟Win32API是一樣.
public static void Main()
{
Console.WriteLine(add(10,30));
}
}
C:/>InvokeDll
40
回過頭來,如果我們在MyLib.cpp中沒有加上 extern"C" 在,那么C中通過函數名 add 定位不到導出方法(因為函數名在動態庫中已經變了),執行invokeDll時就會出現如下錯誤。
未處理的異常: System.EntryPointNotFoundException: 無法在 DLL MyLib.dll 中找到名為 add 的入口點。
at InvokeDll.add(Int32 a, Int32 b)
at InvokeDll.Main()
[注:]本文參考著網上一篇文章:C-Sharp調用標準動態庫 ,但是直接照著原文的操作就是會無法定位 add 的入口點的錯誤,所以略有修改。
新聞熱點
疑難解答