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[]:传给要调用的函数的参数列表或者要给属性赋的值


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