C 載入C C 動態庫的方法

2021-07-14 19:12:42 字數 3983 閱讀 6351

public delegate int putvalue(string name, string value);

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

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

object worker = activator.createinstance(tworker);//建立物件

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

//執行函式,後乙個引數即為執行函式需要的引數,若無則為null

method.invoke(tworker, new object );

tworker.invokemember("putvalue", bindingflags.invokemethod, null, worker,

new object ); //使用這句可以替換上面兩句

2.1 靜態呼叫

[dllimport(@"***.dll", entrypoint = "putvalue", charset = charset.ansi, 

callingconvention = callingconvention.stdcall)]

public static extern int putvalue(string name, string value);

putvalue("transtype", transtype);

2.2 動態呼叫

public class dllinvoke

public dllinvoke(string lpfilename)

// 引數傳遞方式列舉 ,byvalue 表示值傳遞 ,byref 表示址傳遞

public enum modepass

[dllimport("kernel32.dll")]

private static extern intptr loadlibrary(string lpfilename);

[dllimport("kernel32.dll")]

private static extern intptr getprocaddress(intptr hmodule, string lpfunname);

[dllimport("kernel32.dll")]

public static extern bool freelibrary(intptr hmodule);

// loadlibrary 返回的函式庫模組的控制代碼

private intptr m_hmodule = intptr.zero;

// 裝載 dll

public void loaddll(string lpfilename)

}// 獲得函式指標

private intptr loadfun(string lpfunname)

// 取得函式指標

hfuncproc = getprocaddress(m_hmodule, lpfunname);

// 若函式指標為空,則丟擲異常

if (hfuncproc == intptr.zero)

return hfuncproc;

}// 解除安裝 dll

public void unloaddll()

}// 方法一:使用c#提供的函式進行呼叫

public object invoke(string funcname, object objarray_parameter,

type typearray_parametertype, modepass modepassarray_parameter, type type_return)

if (objarray_parameter.length != modepassarray_parameter.length)

hfuncproc = loadfun(funcname);

// 下面是建立 myassemblyname 物件並設定其 name 屬性

assemblyname myassemblyname = new assemblyname();

myassemblyname.name = "invokefun";

// 生成單模組配件

myassemblyname, assemblybuilderaccess.run);

modulebuilder mymodulebuilder = myassemblybuilder.definedynamicmodule("invokedll");

// 定義要呼叫的方法 , 方法名為「 myfun 」,返回型別是「 type_return 」引數型別是「 typearray_parametertype 」

methodbuilder mymethodbuilder = mymodulebuilder.defineglobalmethod("myfun",

methodattributes.public|methodattributes.static, type_return, typearray_parametertype);

// 獲取乙個 ilgenerator ,用於傳送所需的 il

ilgenerator il = mymethodbuilder.getilgenerator();

for (int i = 0; i < objarray_parameter.length; i++)

}// 判斷處理器型別

if (intptr.size == 4)

else if (intptr.size == 8)

else

il.emitcalli(opcodes.calli, callingconvention.cdecl, type_return, typearray_parametertype);

il.emit(opcodes.ret); // 返回值

mymodulebuilder.createglobalfunctions();

// 取得方法資訊

methodinfo mymethodinfo = mymodulebuilder.getmethod("myfun");

return mymethodinfo.invoke(null, objarray_parameter);// 呼叫方法,並返回其值

}// 方法二:使用windows提供的api進行呼叫

public delegate invoke(string lpfunname, type type)

~dllinvoke()

}

使用方法如下:

public class unmanageddynamicload

dynamicdll = new dllinvoke(strdllpath);

putvalue = (myputvalue)dynamicdll.invoke("putvalue", typeof(myputvalue));

}// 動態載入dll使用方法二:c#提供的介面載入

/*private static void putvalue(string name, string value)

;type parametertypes = new type ;

dllinvoke.modepass themode = new dllinvoke.modepass ;

dynamicdll.invoke("putvalue", parameters, parametertypes, themode, typeof(int));}*/

//進行呼叫

public static void dopay(string transtype)

catch (exception ex)

dynamicdll.unloaddll();

}}

C 動態載入動態庫 AIX

部分內容 函式說明 1.開啟動態鏈結庫 include void dlopen const char filename,int flag 該函式返回操作控制代碼,如 void phandle dlopen strsofilepath,rtld lazy flag rtld lazy 暫緩決定,等有需...

c 動態庫多層動態載入的問題

問題描述 今有第三方庫曰xplico,將xplico.c中的main函式改寫成xplico main然後修改makefile,將之由可執行程式改造成動態庫libxplico.so 然後編寫測試程式test.cpp 與libxplico.so放到同一路徑下 其內容如下 include include ...

動態庫載入方法及問題

在vc中兩種方式的具體方法 一 動態庫的隱示呼叫 在 vc 工程中直接鏈結靜態輸入庫 lib,然後即可像呼叫其它原始檔中 的函式一樣呼叫dll中的函式了。二 動態庫的顯式呼叫 顯式呼叫動態庫步驟 1 建立乙個函式指標,其指標資料型別要與呼叫的 dll 引出函式相吻 合。2 通過 win32 api ...