1. 程式人生 > >通過反射呼叫動態連線庫中的方法

通過反射呼叫動態連線庫中的方法

[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就直接使用它,而不去查詢某些環境變數或者系統設定的函式庫所在的目錄了。