c 託管非託管Dll動態呼叫

2021-08-21 12:32:58 字數 1257 閱讀 6780

最近經常看到有人問託管非託管dll呼叫的問題。對於動態庫的呼叫其實很簡單。網上很多**都實現了dll的靜態呼叫方法。我主要談論下動態庫的動態載入。

對於託管動態庫,實現動態載入很簡單。

/files/dwwwing/dlldemo.rar

code= assembly.loadfile(filepath);//這裡是動態庫的路徑。

type tp = ass.gettype(dlltype);//dlltype是你所需要呼叫的動態庫檔案的命名空間+類名(namespace.class)

methodinfo method = tp.getmethod(function);//需要執行的函式

object ob = activator.createinstance(tp);//建立物件

method.invoke(ob, null);//執行函式,後乙個引數即為執行函式需要的引數,若無則為null。

對於非託管dll的呼叫。相對託管動態庫來說麻煩一點,但是也是很簡單的。

使用三個api函式:loadlibrary,getprocaddress,freelibrary。

使用loadlibrary將非託管dll載入到記憶體中。呼叫getprocaddress獲取需呼叫的函式指標。將非託管函式指標轉換為委託即可。最後呼叫freelibrary釋放載入載入的非託管記憶體(載入後必須釋放非託管記憶體)。

code system;

using system.collections.generic;

using system.text;

using system.runtime.interopservices;

namespace dlltest

public delegate invoke(string funname, type type)

~dllinvoke()

}}

完成上面的函式宣告後,接著我們先定乙個委託.

delegate bool dodllfunction();//如果需要執行的函式有引數,可對之進行宣告。

dllinvoke dllinvoke = new dllinvoke(filepath);//非託管dll檔案路徑

dodllfunction show = (dodllfunction) dllinvoke.invoke(initfunction,typeof(dodllfunction));// initfunction為需要執行的函式名

show();//執行方法,可根據定義決定是否需要傳引數

託管非託管Dll動態呼叫

最近經常看到有人問託管非託管 dll呼叫的問題。對於動態庫的呼叫其實很簡單。網上很多 都實現了 dll的靜態呼叫方法。我主要談論下動態庫的動態載入。對於託管動態庫,實現動態載入很簡單。files dwwwing dlldemo.rar code assembly.loadfile filepath ...

C 呼叫託管DLL與非託管DLL

dll之前使用過幾次,但是最近使用時,又出各種問題。最後弄到晚上十二點多了,看到網上乙個建立dll的 教程,按上面的講解,成功實現了c 呼叫自己建立的dll。之所以耗了這麼久時間,是因為我本想憑自己記憶實現dll建立呼叫,但是各種問題隨即產生。不說了,割了 今天上午再次整理,覺得有必要記錄。c 呼叫...

託管呼叫非託管的DLL

dllimport createnewprocess.dll charset charset.unicode public static extern bool createprocess marshalas unmanagedtype.lpwstr string fullpath 以上是定義入口,...