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 ...