通過反射呼叫動態連線庫中的方法
[Description("通過DLL路徑,實現動態呼叫動態連結庫中指定類的(靜態)方法和屬性")]
public class DynamicReflectDLL : MarshalByRefObject
{
#region properties
public string DLLPath
{
get;
set;
}
#endregion
#region 反射函式
public DynamicReflectDLL(string dllPath)
{
DLLPath= dllPath;
}
/// <summary>
/// 引用例項方法
/// </summary>
/// <param name="pars"></param>
/// <param name="reflectPars"></param>
/// <param name="bFlags"></param>
/// <returns></returns>
private object CommonFun(string className,string methodName, object[] reflectPars, BindingFlags bFlags)
{
Assembly newDLL;
Type obj;
Object instObj;
try
{
//通過路徑載入程式集
newDLL = Assembly.LoadFrom(DLLPath);
//獲取程式集的型別
obj = newDLL.GetType(className);
//建立這個型別的一個例項
instObj = Activator.CreateInstance(obj);
//注意通過例項呼叫成員時要使用 BindingFlags.Instance
return obj.InvokeMember(methodName,
BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | bFlags,
null,
instObj,
reflectPars);
}
catch
{
return null;
}
finally
{
newDLL = null;
obj = null;
instObj = null;
}
}
/// <summary>
/// 反射呼叫靜態方法
/// </summary>
/// <param name="className">包含名稱空間的類名稱</param>
/// <param name="methodName"></param>
/// <param name="reflectPars"></param>
/// <param name="bFlags"></param>
/// <returns></returns>
private object CommonStaticFun(string className,string methodName, object[] reflectPars, BindingFlags bFlags)
{
Assembly newDLL;
Type obj;
try
{
newDLL = Assembly.LoadFrom(DLLPath);
obj = newDLL.GetType(className);
return obj.InvokeMember(methodName,
BindingFlags.DeclaredOnly | BindingFlags.Public
|BindingFlags.Static | bFlags,
null,
obj,
reflectPars);
}
catch { return null;}
finally
{
newDLL = null;
obj = null;
}
}
/// <summary>
/// 通過反射方式執行方法
/// </summary>
/// <param name="pars">引數列表(1.包含名稱空間的型別名稱 2.要呼叫的方法名)</param>
/// <param name="methodPars">要通過反射方式呼叫方法的引數列表</param>
/// <returns>通過反射執行方法的返回值</returns>
public void ExeMethodByReflect(object parm)
{
RefParm parmobj = (RefParm)parm;
CommonFun(parmobj.ClassName,parmobj.MethodName, parmobj.methodPars,BindingFlags.InvokeMethod);
}
/// <summary>
/// 通過反射方式執行靜態方法
/// </summary>
/// <param name="pars">引數列表(1.包含名稱空間的型別名稱 2.要呼叫的方法名)</param>
/// <param name="methodPars">要通過反射方式呼叫方法的引數列表</param>
/// <returns>通過反射執行方法的返回值</returns>
public void ExeStaticMethodByReflect(object parm)
{
RefParm parmobj =(RefParm)parm;
CommonStaticFun(parmobj.ClassName,parmobj.MethodName,parmobj.methodPars,BindingFlags.InvokeMethod);
}
public struct RefParm
{
public string ClassName;
public string MethodName;
public object[] methodPars;
public RefParm(string myClassName,string myMethodName,object[]myMethodPars)
{
ClassName = myClassName;
MethodName = myMethodName;
methodPars = myMethodPars;
}
}
#endregion
}
相關推薦
通過反射呼叫動態連線庫中的方法
[Description("通過DLL路徑,實現動態呼叫動態連結庫中指定類的(靜態)方法和屬性")] public class DynamicReflectDLL : MarshalByRefObject { #regio
c編譯,呼叫動態連線庫 (.so檔案)
c編譯,呼叫動態連線庫 (.so檔案) C編譯: 動態連線庫 (.so檔案) Linux動態連結庫.so檔案的命名及用途總結 Linux程式設計練習(二)—— Linux下.so動態庫的建立和呼叫 在“紙上談兵: 演算法與資料結構”中,我在每一篇都會有一個C程式,用於實現演算法和資料
Java通過JNI 呼叫動態連結庫DLL
JNI(Java Native Interface)Java本地介面,主要作用是實現java程式碼與C、C++編寫的程式碼互動。 在Android程式設計中,so庫的訪問也用到了jni技術。 理論多說無益,還是看java連線dll的實戰吧。如下: 例:java中呼叫demo.
Java通過反射呼叫一個類的私有方法
本文轉載自:https://www.cnblogs.com/ghq120/p/8439204.html獲得私有方法的流程是(1)獲取目標類(2)獲取目標方法 Method method=clazz.getDeclaredMethod(name);//可以呼叫類中的所有方法(
java中呼叫C/C++編寫的生成的動態連線庫dll檔案介面的簡單例子
1、首先用java編寫一個簡單類 public class Hello { public native void sayHello(); static { System.loadLibrary("HelloDll"); } public static void
Java 動態的建立注入程式碼,注入方法給類或者介面並通過反射呼叫
Java 動態拼接程式碼,將字串寫入檔案並編譯執行。 1 拼接程式碼並生成檔案 /* * 文 件 名: WriteJavaFile.java * 版 權: Sunny Technologies Co., Ltd. Copyright YYY
通過反射獲取class文件中的構造方法,運行構造方法
對象 rgs span for instance .... urn his col /* * 通過反射獲取class文件中的構造方法,運行構造方法 * 運行構造方法,創建對象 * 1、獲取class文件對象 * 2、從class文件對象中,獲取需要
JAVA——陣列擷取——呼叫庫中方法
1,使用Java類庫中的方法System.arraycopy 2,使用Java類庫中的方法 java.util.Arrays.copyOf 3,重寫myCopy (一)使用.arraycopy方法——陣列擷取 使用方法:System.arraycopy(源陣列名稱,源陣列開始點,目標陣列名稱
【Java筆記】通過反射配置檔案執行類中的方法
要求:在一個Test類中呼叫不同類中的方法,不改動Test原始碼,如何做到? 實現方法:將要執行的類名和方法名,以鍵值對的形式卸儲存在文字中,執行哪個類就讀取配置檔案即可。 實現步驟:1.準備配置檔案,鍵值對 &nbs
OSGi bundle之間通過反射呼叫方法
兩個bundle之間不通過pom檔案引入jar包方式呼叫另一個方法,通過反射的方式呼叫。 前提:被呼叫的方法的bundle需要配置 <Export-Package> 要提供的被引用的包</Export-Package> 呼叫方需要配置 <I
MFC/Qt下呼叫caffe原始碼(二)---MFC下呼叫caffe的動態連線庫dll檔案
首先,先看下最後的效果吧。 win7 vs2013 新建一個MFC 工程 注:MFC中如何最簡便的方法將圖片顯示到對話方塊中?大家可以搜下,很多種方法,但是我採用的是最簡單的方法,即將opencv視窗繫結到MFC的PIcture control上。 在:
Linux下執行時呼叫動態連結庫.so的三種方法(筆記)
在/etc/ld.so.conf.d/下建立xxx.conf,在文字中加入.so所在路徑,如:/usr/xxx等等,然後使用相應ldconfig命令使之生效。 將.so所在路徑新增為LD_LIBRARY_PATH環境變數。 在編譯命令中使用-Wl,-rpath
codeblocks中建立和呼叫動態連結庫(dll)
一、建立C語言動態連結庫 1.建立。 File->New->Projects->Dynamic Link library->Go 給專案命名為:Dynamic librar
C#反射呼叫另外一個類中的私有欄位和方法
/// <summary> /// 設計器支援所需的方法 - 不要 /// 使用程式碼編輯器修改此方法的內容。 /// </summary> private void InitializeComponent()
C# 呼叫 C++ dll 動態連結庫中多個函式時全域性變數的問題
最近編寫C#程式呼叫C++語言的演算法庫,自己嘗試在C++中封裝好DLL庫,並在一個工程檔案中同時匯出多個函式供C#呼叫。多個函式之間需要相互通訊,但又不能互相呼叫,,一個很好的方法就是用全域
萬無一失地通過反射呼叫方法
大概BeanUtils大半人都用過,MethodUtils用過的人少。最後寫一個東西需要通過反射呼叫方法,就自己通過簡單的反射來實現,測試通過,但是發現在多個ClassLoader的環境中有問題(尤其是有繼承關係的時候),明明有這個方法卻說沒有這個方法,或者獲取到了方法卻無法
python中呼叫動態連結庫(C++,linux)
1,建立並編譯C++程式 #include <fstream> #include <assert.h> #include <malloc.h> #incl
java通過反射呼叫不同引數的方法
import java.lang.reflect.Method; public class testReflect { /** * @param args */ public sta
JSP中如何通過JSP呼叫類(.java)中的方法
1.新建一個專案,在src資料夾下新增一個包:如:tianaoweb.com; 2.再在包中新增一個類:如 package com; public class test { public String sd(){ return "sd"; } } 3.在預設的首頁in
如何讀取動態連結庫中的符號表,並呼叫
dlopen函式開啟一個函式庫然後為後面的使用做準備。C語言原形是: void * dlopen(const char *filename, int flag); 如果檔名filename是以“/”開頭,也就是使用絕對路徑,那麼dlopne就直接使用它,而不去查詢某些環境變數或者系統設定的函式庫所在的目錄了。