鸟语天空
程序集——Assembly
post by:追风剑情 2016-7-15 17:55

示例:动态加载dll并调用其方法

DllLib.dll

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DllLib
{
    public class Class1
    {
        public static void Show1()
        {
            Console.WriteLine("Class1 static Show1");
        }

        public void Show2()
        {
            Console.WriteLine("Class1 Show2");
        }
    }

    public class Class2
    {
        public static void Show1()
        {
            Console.WriteLine("Class2 static Show1");
        }

        public void Show2()
        {
            Console.WriteLine("Class2 Show2");
        }
    }
}


测试类

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace AssemblyTest1
{
    class Program
    {
        static void Main(string[] args)
        {
            //加载程序集
            Assembly assembly;
            byte[] rawAssembly = loadFile("DllLib.dll");
            //如果调试文件存在
            if (File.Exists("DllLib.pdb"))
            {
                byte[] rawSymbolStore = loadFile("DllLib.pdb");
                assembly = Assembly.Load(rawAssembly, rawSymbolStore);
            }
            else
            {
                assembly = Assembly.Load(rawAssembly);
            }
            
 
            Type type1 = assembly.GetType("DllLib.Class1");//这里要填FullName
            //调用静态方法
            MethodInfo mi = type1.GetMethod("Show1", BindingFlags.Static | BindingFlags.Public);
            mi.Invoke(null, null);
            //调用实例方法
            mi = type1.GetMethod("Show2", BindingFlags.Instance | BindingFlags.Public);
            //创建实例的两种方式
            //Activator.CreateInstance(type1)
            //assembly.CreateInstance("DllLib.Class1")
            mi.Invoke(Activator.CreateInstance(type1), null);//通常用这种方式创建实例对象
            mi.Invoke(assembly.CreateInstance("DllLib.Class1"), null);
 
            Console.Read();

        }

        static byte[] loadFile(string filename)
        {
            FileStream fs = new FileStream(filename, FileMode.Open);
            byte[] buffer = new byte[(int)fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            fs.Close();

            return buffer;
        }
    }
}

 

运行测试

22222.png

评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容