Assembly動態加載DLL

DLL代碼:

using System;

namespace clsTestDll
{
    public class TestDll
    {
        private string strName;
        public TestDll()
        {
            strName = "";
        }
        public string GetValue(int nCount)
        {
            return string.Format("Count is {0}!", nCount);
        }
        public static string GetNewValue(int nCount)
        {
            return string.Format("New count is {0}!", nCount);
        }

        public string Name
        {
            get { return strName; }
            set { strName = value; }
        }
    }
}

調用程序代碼:

using System;
using System.Reflection;
namespace TestString
{
    class Program
    {
        public static void Main()
        {
            Assembly assembly = Assembly.LoadFrom(@"E:\clsTestDll.dll");
            Type type = assembly.GetType("clsTestDll.TestDll");
            /*調用DLL中的靜態方法*/
            string returnStaticStr = (string)type.InvokeMember(
                                                "GetNewValue",
                                                BindingFlags.DeclaredOnly 
                                                | BindingFlags.Public
                                                | BindingFlags.Static 
                                                | BindingFlags.InvokeMethod,
                                                null, null, new object[] { 12 });
            /*調用DLL中的非靜態方法*/
            //1.新建一個object
            Object newObject = type.InvokeMember(
                                                null,
                                                BindingFlags.DeclaredOnly 
                                                | BindingFlags.Public
                                                | BindingFlags.NonPublic
                                                | BindingFlags.Instance 
                                                | BindingFlags.CreateInstance,
                                                null, null, null);
            //2.使用object調用DLL中的非靜態方法
            string returnNostaticStr = (string)type.InvokeMember(
                                                "GetValue",
                                                 BindingFlags.DeclaredOnly 
                                                 | BindingFlags.Public 
                                                 | BindingFlags.NonPublic
                                                 | BindingFlags.Instance 
                                                 | BindingFlags.InvokeMethod, 
                                                null, newObject, new object[] { 20 });
            /*調用DLL中的屬性*/
            //1.設置屬性的值
            type.InvokeMember(
                                                "Name",
                                                 BindingFlags.DeclaredOnly 
                                                 | BindingFlags.Public 
                                                 | BindingFlags.NonPublic 
                                                 | BindingFlags.Instance 
                                                 | BindingFlags.SetProperty,
                                                null, newObject, new object[] { "PropertyTest" });
            //2.調用屬性
            string getProperty = (string)type.InvokeMember(
                                                "Name",
                                                BindingFlags.DeclaredOnly 
                                                | BindingFlags.Public 
                                                | BindingFlags.NonPublic
                                                | BindingFlags.Instance
                                                | BindingFlags.GetProperty,
                                                null, newObject, null);

            Console.WriteLine(returnStaticStr);
            Console.WriteLine(returnNostaticStr);
            Console.WriteLine(getProperty);
            Console.ReadKey();
        }
    }
}

輸出結果:
New count is 12!
Count is 20!
PropertyTest

解釋:

public object InvokeMember(string,BindingFlags,Binder,object,object[]);

      string:要調用的成員名
      BindingFlags:要調用的函數的屬性,可以組合,System.Reflection.BindingFlags  
      Binder:高級內容,先不看  
      object:調用該成員的實例  
      object[]:傳給要調用的函數的參數列表或者要給屬性賦的值


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章