分享免费的编程资源和教程

网站首页 > 技术教程 正文

104.C# Assembly 程序集

goqiw 2025-01-03 15:44:41 技术教程 6 ℃ 0 评论

摘要


程序集是代码进行编译是的一个逻辑单元,把相关的代码和类型进行组合,然后生成PE文件。程序集只是逻辑上的划分,一个程序集可以只由一个文件组成,也可由多个文件组成。不管是单文件程序集还是多文件程序集,它们都由固定的结构组成。

正文


常见的两种程序集:

可执行文件(.exe文件)和 类库文件(.dll文件)。

在VS开发环境中,一个解决方案可以包含多个项目,而每个项目就是一个程序集。

查询继承父类的程序集合BaseType

.NET的程序集对象Assembly有个属性BaseType,来返回当前程序集的基础类型,默认是Object。通过该属性可以判断某个程序集是否是继承了某个父类;

程序集B被A程序引用,获取A程序集的信息GetCallingAssembly

.NET的程序集对象Assembly有个方法GetCallingAssembly获取当前程序集被调用的上级程序集的信息;

查找当前项目的程序集GetAssemblies

查找当前项目所有程序集的方法System.AppDomain.CurrentDomain.GetAssemblies();

使用Assembly

using System.Reflection;

实例化

我们创建一个项目Is.User

创建一个类 Class Library

namespace Is.User
{
    public class User
    {
        public string Id { get; set; }  
        public string Name { get; set; }
        public string Show()
        {
            return this.Id + " " + this.Name;
        }
    }
}

这里我们不去在主项目中引用它,准备通过Assembly 中的方法动态实例化

常用的有三个方法:

  • Assembly.Load()
  • Assembly.LoadFrom()
  • Assembly.LoadFile()

将编译好的Is.User.dll 拷贝到对应目录。

private void btnInstance_Click(object sender, EventArgs e)
{
    Assembly assembly = Assembly.LoadFrom("./Is.User.dll"); //通过文件路径加载
    Type[] allTypes = assembly.GetTypes();
    Type type = assembly.GetType("Is.User.User");
    object user = Activator.CreateInstance(type);
    type.GetProperty("Id").SetValue(user, "1");
    type.GetProperty("Name").SetValue(user, "张飞");
    var ret= type.GetMethod("Show").Invoke(user, new object[] { });
    MessageBox.Show(ret.ToString());
}

修改成LoadFrom效果一样

Assembly assembly = Assembly.LoadFrom("./Is.User.dll");

LoadFile与LoadFrom的区别

  • Assembly.LoadFile只载入相应的dll文件,不会载入对应这个dll的其它引用dll。
  • Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,def.dll也会被载入。
  • LoadFile 方法用来来加载和检查具有相同标识但位于不同路径中的程序集.但不会加载程序的依赖项。
  • LoadFrom 不能用于加载标识相同但路径不同的程序集。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表