c#使用反射加载程序集Assembly。load()使用全过程

来源:互联网 发布:网络视频监控平台 编辑:程序博客网 时间:2024/05/05 05:54

第一步 :创建一个将被加载的程序集 类库Test

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Test{    public  class Class1    {        string name, age;        public Class1(string Name, string Age)        {            name = Name;            age = Age;        }        public string GetMessage()        {            return name +","+ age;        }        public string GetJvalue(int a,int b)        {            return (a+b).ToString();        }    }}

第二步:创建强命名程序集

首先打开visual studio 2008命令提示(开始-->程序-->microsoft visual studio 2008-->visual studio  tools-->visual studio 命令提示),在其中输入:sn  -k  Test.snk回车,这样就生成了 Test.snk,在路径C:\Program Files\Microsoft Visual Studio 9\VC找到 Test.snk文件,放在Test类库的根目录

然后右键 类库Test  属性--签名

最后编译 得到Test.dll 强命名程序集

第三步:拷贝Test.dll 到需要使用它的项目BIN目录下

(如果要使用自己定义的目录可以在 配置文件 在<configuration> – <runtime> – <assemblyBinding>元素下 定义个 <probing privatePath="DllPath"/>)

这样可以将Test.dll放入DllPath文件夹下亦可

然后 代码加载 使用 如下:

在此之前

打开“Visual Studio 2008 命令提示”,输入:

sn -T C:\Test.snk

回车

如果程序集具有强名称,则会输出结果:
公钥标记为8d7b357e8456bb71(PublicKeyToken)

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Reflection;public partial class Default4 : System.Web.UI.Page{    protected void Page_Load(object sender, EventArgs e)    {        Invoke("Test", "1.0.0.0", "neutral", "8d7b357e8456bb71", "Test", "Class1", "GetMessage",new object[] {"1","p"});                     }    private string Invoke(string lpFileName, string Version, string Culture, string PublicKeyToken, string Namespace, string ClassName, string lpProcName,object[] objArr)    {        string ssc = "";        try        { // 载入程序集            Assembly MyAssembly = Assembly.Load(lpFileName + ", Version=" + Version + ", Culture=" + Culture + ", PublicKeyToken=" + PublicKeyToken);            Type[] type = MyAssembly.GetTypes();            foreach (Type t in type)            {// 查找要调用的命名空间及类                if (t.Namespace == Namespace && t.Name == ClassName)                {// 查找要调用的方法并进行调用                    MethodInfo m = t.GetMethod(lpProcName);                    if (m != null)                    {                        object o = Activator.CreateInstance(t, objArr);                        ssc = (string)m.Invoke(o, null);                        m.Invoke(o, null);                    }                    else                         ssc=" 装载出错 !";                }            }        }//try        catch (System.NullReferenceException e)        {            ssc=e.Message;        }//catch        return ssc;    }}

测试成功!


另外还有2种加载方法 比较简单 此不赘述



原创粉丝点击