资源文件里面添加Dll,然后在程序中使用该Dll

资源文件里面添加Dll,然后在程序中使用该Dll

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO; // 对文件的读写需要用到此命名空间
using System.Reflection; // 使用 Assembly 类需用此命名空间
using System.Reflection.Emit; // 使用 ILGenerator 需用此命名空间

namespace DllEmbedResource测试
{
    public class TestClass
    {
        // 记录要导入的程序集
        private static Assembly MyAssembly;
        private static Type[] _types;
        public TestClass()
        {
            try
            {// 判断 MyAssembly 是否为空或 MyAssembly 的命名空间不等于要调用方法的命名空间,如果条件为真,就用 Assembly.Load 加载所需 DLL 作为程序集 i
                if (MyAssembly == null || MyAssembly.GetName().Name != "TestDll")
                    MyAssembly = Assembly.Load(DllEmbedResource测试.Properties.Resources.TestDll);
                Type[] type = MyAssembly.GetTypes();
                _types =type ;
            }
            catch
            {
            }
        }
        /// <summary>
        /// 根据命名空间和类型名获得类型
        /// </summary>
        /// <param name="_nameSpace"></param>
        /// <param name="_className"></param>
        /// <returns></returns>
        public Type GetType(string _nameSpace,string _className)
        {
            foreach (Type t in _types)
            {
                if (t.Namespace == _nameSpace && t.Name == _className)
                {
                    return t;
                }
            }
            return Type.GetType("String");
        }
        /// <summary>
        /// 根据类型和参数创建实例
        /// </summary>
        /// <param name="_type"></param>
        /// <param name="?"></param>
        /// <returns></returns>
        public object  CreateInstance(Type _type,object [] _parameter)
        {
            return Activator.CreateInstance (_type,_parameter );
        }

        /// <summary>
        ///根据类型创建实例
        /// </summary>
        /// <param name="_type"></param>
        /// <returns></returns>
        public object CreateInstance(Type _type)
        {
            return Activator.CreateInstance(_type);
        }

        /// <summary>
        /// 根据实例、类类型、方法名、方法参数获得方法的结果
        /// </summary>
        /// <param name="_instance"></param>
        /// <param name="_type"></param>
        /// <param name="_methordName"></param>
        /// <param name="_parameter"></param>
        /// <returns></returns>
        public object GetInstanceMethordResult(object _instance,Type _type,string _methordName,object [] _parameter)
        {
            MethodInfo displayInfoMethod =_type .GetMethod (_methordName );
            return displayInfoMethod .Invoke(_instance ,_parameter);
        }

        /// <summary>
        /// 根据类类型、方法名、方法参数获得静态方法的结果
        /// </summary>
        /// <param name="_type"></param>
        /// <param name="_methordName"></param>
        /// <param name="_parameter"></param>
        /// <returns></returns>
        public object GetStaticMethordResult( Type _type, string _methordName, object[] _parameter)
        {
            MethodInfo m = _type.GetMethod(_methordName);
            if (m != null)
            {
                object o = Activator.CreateInstance(_type);
                return m.Invoke(o,_parameter );
            }
            else
            {
                //System.Windows.Forms.MessageBox.Show(" 装载出错 !");
            }
            return (object)0;
        }

        /// <summary>
        /// 根据实例、类类型、属性、属性值设置实例的属性
        /// </summary>
        /// <param name="_instance"></param>
        /// <param name="_type"></param>
        /// <param name="_attribute"></param>
        /// <param name="_parameter"></param>
        public void SetInstanceAttribute(object _instance,Type _type,string _attribute,object [] _parameter)
        {
            _type.InvokeMember(_attribute , BindingFlags.SetProperty, null, _instance , _parameter );
        }

        /// <summary>
        /// 根据实例、类类型、属性、获得属性的值
        /// </summary>
        /// <param name="_instance"></param>
        /// <param name="_type"></param>
        /// <param name="_attribute"></param>
        /// <returns></returns>
        public object GetInstanceAttribute(object _instance,Type _type,string _attribute)
        {
            return _type.InvokeMember(_attribute, BindingFlags.GetProperty, null , _instance, null);
        }

        /// <summary>
        /// 根据实例、类类型、字段、字段值设置实例的字段
        /// </summary>
        /// <param name="_instance"></param>
        /// <param name="_type"></param>
        /// <param name="_attribute"></param>
        /// <param name="_parameter"></param>
        public void SetInstanceField(object _instance,Type _type,string _field,object [] _parameter)
        {
            _type.InvokeMember(_field , BindingFlags.SetField, null,_instance ,_parameter);
        }

        /// <summary>
        /// 根据实例、类类型、字段、获得字段的值
        /// </summary>
        /// <param name="_instance"></param>
        /// <param name="_type"></param>
        /// <param name="_field"></param>
        /// <returns></returns>
        public object GetInstanceField(object _instance,Type _type,string _field)
        {
            return _type.InvokeMember(_field, BindingFlags.GetField, null,_instance , null);
        }

        public object InvokeAttribute(string lpProcName)
        {
            try
            {// 判断 MyAssembly 是否为空或 MyAssembly 的命名空间不等于要调用方法的命名空间,如果条件为真,就用 Assembly.Load 加载所需 DLL 作为程序集 i
                if (MyAssembly == null || MyAssembly.GetName().Name != "TestDll")
                    MyAssembly = Assembly.Load(DllEmbedResource测试.Properties.Resources.TestDll);
                Type[] type = MyAssembly.GetTypes();
                foreach (Type t in type)
                {
                    if (t.Namespace == "TestDll" && t.Name == "ZhouyzTestDll")
                    {
                        PropertyInfo m = t.GetProperty(lpProcName);
                        if (m != null)
                        {// 调用并返回
                            object o = Activator.CreateInstance(t);
                            return null;
                        }
                        else
                        {
                            //System.Windows.Forms.MessageBox.Show(" 装载出错 !");
                        }
                    }
                }
            }
            catch (System.NullReferenceException e)
            {
                //System.Windows.Forms.MessageBox.Show(e.Message);
            }
            return (object)0;
        }
    }

}

其他资源:http://hi.baidu.com/frankzye/blog/item/347db48b4a873adbfc1f104d.html

 

posted @ 2010-01-04 17:22  星释天狼  阅读(272)  评论(0)    收藏  举报