C#插件式开发——详解程序集Assemblies

这篇具有很好参考价值的文章主要介绍了C#插件式开发——详解程序集Assemblies。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Assembly是.net中的基本部署单元,也是所有类型的容器。程序集包含编译类型及其 IL(中间语言)代码、运行时资源和信息,以助于版本控制、安全和引用其他程序集。程序集定义了类型解析和安全许可的边界。

一般来说,一个程序集包括一个单一的Windows可移植执行文件(PE)--如果是一个应用程序,扩展名为.exe,如果是一个可重用的库,扩展名为.dll。WinRT库的扩展名是.winmd,与.dll类似,只是它只包含元数据,没有IL代码。

本节的大多数类型来自下面几个命名空间:

System.Reflection

System.Resources

System.Globalization

Assembly具体是什么

一个Assembly包含四类文件(数据):

  • 程序集清单(assembly manifest):

向.net运行时提供的信息,比如程序集的名称,版本,要求的许可,以及它引用的其他程序集。

  • 应用程序清单(An application manifest):

向操作系统提供的信息,比如程序集应该如何被部署,是否需要管理员权限。

  • 已编译的类型(Compiled types):

已编译的 IL 代码和程序集中定义的类型的元数据

  • 资源(Resources)

程序集重点其他数据,比如图片和本地文本。

只有程序集清单(assembly manifest)是必须的,尽管一个程序集几乎总是包含编译过的类型(除非它是一个WinRT参考程序集)。

无论是可执行文件还是库,程序集的结构都是相似的。这与可执行文件的主要区别在于它定义了一个入口点。

程序集清单(The Assembly Manifest)

程序集清单有两个目的:

  • 向托管主机环境描述程序集
  • 它充当程序集中模块(modules)、类型(types)和资源(resources)的目录

因此,程序集是自描述的。使用者以发现一个程序集的所有数据、类型和函数,而不需要额外的文件。

程序集清单不需要你手动添加到程序集,它作为编译的一部分自动嵌入到程序集中的

清单内容

以下是清单中存储的具有重要功能的数据的

  • 程序集的简单名称
  • 一个版本号(AssemblyVersion)
  • 程序集的公钥和签名哈希(如果有强命名)
  • 引用程序集的列表,包括它们的版本和公钥
  • 程序集中定义的类型列表
  • 它所针对的文化(culture),如果是附属程序集 (AssemblyCulture)

清单还可以存储以下信息数据

  • 程序集的完整的标题和描述(AssemblyTitle 和 AssemblyDescription)
  • 公司和版权信息(AssemblyCompany 和 Assembly

版权)

  • 显示版本(AssemblyInformationalVersion)
  • 自定义数据的附加属性

其中一些数据来自提供给编译器的参数,例如引用程序集的列表或用于签署程序集的公钥。其余来自程序集属性,在括号中表示

查看清单内容

您可以使用 .NET 工具 ildasm.exe 查看程序集清单的内容。也可以使用反射以编程方式执行相同的操作

设置程序集属性

常用的程序集属性可以在 Visual Studio 中项目的属性页上的包选项卡(Package tab)上指定。该包选项卡(Package tab)上的设置将被添加到项目文件 (.csproj)。

如果要指定包选项卡不支持的属性,或者如果不使用.csproj 文件,您可以在源代码中指定程序集属性。

.NET Framework项目会在Properties目录自动创建一个文件AssemblyInfo.cs,但 .NET Core 项目没有。

尽管你可以在项目中的任何源代码文件中指定属性,但专门为属性添加一个.cs文件,可以让你把它们放在一起,并且组织得很好。

一个专门的属性文件只包含using语句和汇编属性的声明。例如,为了向一个单元测试项目暴露内部范围的类型。

你应该这样做:

using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyUnitTestProject")]

应用程序清单(Windows)

应用程序清单是一个XML文件,用于向操作系统传递关于组件的信息。在构建过程中,应用程序清单作为 Win32 资源嵌入到启动可执行文件中。如果清单文件存在,清单会在CLR加载程序集之前被读取和处理,并且会影响Windows启动应用程序进程的方式。

一个.NET应用清单在XML名称空间中具有一个名为assembly的根元素

urn:schemas-microsoft-com:asm.v1:

<?xml version="1.0" encoding="utf-8"?> 
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> 
  <!-- contents of manifest --> 
</assembly>

下面的清单指示操作系统请求管理权限提升:

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
	<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
		<security>
			<requestedPrivileges>
				<requestedExecutionLevel level="requireAdministrator" />
			</requestedPrivileges>
		</security>	
  </trustInfo>
</assembly>

部署应用程序清单

您可以通过以下方式将应用程序清单添加到 Visual Studio 中的 .NET Core 项目:

在解决方案资源管理器中右键单击您的项目,

选择添加,

然后选择“新建项目”,

然后选择应用程序清单文件

构建后,清单将嵌入到输出程序集中。

.NET 工具 ildasm.exe对嵌入式应用程序清单的存在“视而不见”。但是,如果您在解决方案资源管理器中双击程序集,Visual Studio 会指示是否存在嵌入式应用程序清单

模块(Modules)

程序集的内容实际上打包在一个称为模块的中间容器中。一个模块对应于一个包含程序集内容的文件。

之所以有这个额外的容器层,是为了允许一个程序集跨越多个文件,这个功能在.NETFramework 中存在,但在.NET核心中没有。

c#的引用和插件有什么区别,c#,windows,开发语言,.net,microsoft

尽管 .NET Core 不支持多文件程序集,但有时您需要了解模块带来的额外容器级别。主要场景是有反射的。

装配类(The Assembly Class)

System.Reflection 中的 Assembly 类是在运行时访问程序集元数据的入口(gateway)。

有多种方法可以获得程序集对象:最简单的是通过 Type 的 Assembly 属性

Assembly a = typeof (Program).Assembly;

您还可以通过调用 Assembly 的静态方法之一来获取 Assembly 对象:

GetExecutingAssembly

返回定义当前执行函数的类型的程序集。

GetCallingAssembly

与 GetExecutingAssembly 相同,但用于调用当前正在执行的函数的函数。

GetEntryAssembly

返回定义应用程序原始入口方法的程序集。

拥有 Assembly 对象后,您可以使用其属性和方法来查询程序集的元数据并反射(reflect)其类型

强名称和程序集签名

强命名程序集具有唯一标识。它通过向清单(manifest)添加两位元数据来实现:

  • 属于程序集作者的唯一编号
  • 程序集的签名哈希,证明唯一编号持有者生成了程序集

这需要公钥/私钥对。公钥提供唯一标识号,私钥便于签名。

公钥在保证程序集引用的唯一性方面很有价值:一个强命名的程序集将公钥合并到它的身份中。

强命名在 .NET Core 中不那么重要,因为 .NET Core 没有全局程序集缓存;也不会限制程序集被其他强命名程序集引用。

如何给Assembly强命名,这里先不讲了,因为在.net core中的作用不大。

程序集名称(Assembly Names)

一个程序集的唯一标识包含来自其清单(manifest)中的四个元数据:

  • 它的简单名称(simple name)
  • 版本号(默认是"0.0.0.0")
  • Its culture (“neutral” if not a satellite)
  • 它的公钥令牌(如果没有强命名则为“null”)

这个简单的名字不是来自任何属性,而是来自它最初被编译的文件名(减去任何扩展名)。

因此,System.Xml.dll 程序集的简单名称是“System.Xml”。

重命名文件不会更改程序集的简单名称

版本号来自 AssemblyVersion 属性。它是一个字符串,分为以下四个部分

major.minor.build.revision

您可以如下所示指定版本号:

[assembly: AssemblyVersion ("2.5.6.7")]

区域性来自 AssemblyCulture 属性并应用于附属程序集

The culture comes from the AssemblyCulture attribute and applies to satellite assemblies

正如我们在上一节中讨论的那样,公钥令牌来自编译时提供的强名称

全限定名(Fully Qualified Names)

完全限定的程序集名称是一个包含所有四个标识组件的字符串,格式如下

simple-name, Version=version, Culture=culture, PublicKeyToken=public-key

比如全限定名System.Private.CoreLib.dll 他的简单名称是System.Private.CoreLib,然后Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e。

如上所述,如果有的属性没有值则会被赋为默认值,或为空。

Assembly 对象的 FullName 属性返回其完全限定名称。在清单(manifest)中记录程序集引用时,编译器始终使用完全限定名称

完全限定的程序集名称不包含有助于在磁盘上定位它的目录路径。定位驻留在另一个目录中的程序集是完全不同的事情。文章来源地址https://www.toymoban.com/news/detail-764676.html

到了这里,关于C#插件式开发——详解程序集Assemblies的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue中组件和插件有什么区别?

    组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式,在 Vue 中每一个 .vue 文件都可以视为一个组件 组件的优势 降低整个系统的耦合度,在保持接口不变的情况下,我们可以替换不同的组件快速完成需求,例如输入框,可以替换为日历、时

    2024年02月12日
    浏览(28)
  • C#反射实现插件式开发

    插件式架构,一种全新的、开放性的、高扩展性的架构体系。插件式架构设计好处很多,把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现。扩展功能与框架以一种很松的方式耦合,两者在保持接口不变的情况下,可以独立变化和发布。基于插件设计并不

    2024年02月08日
    浏览(38)
  • vue基础知识十:Vue中组件和插件有什么区别?

    一、组件是什么 回顾以前对组件的定义: 组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式,在Vue中每一个.vue文件都可以视为一个组件 组件的优势 降低整个系统的耦合度,在保持接口不变的情况下,我们可以替换不同的组件快速完成

    2024年02月08日
    浏览(27)
  • C# 中,接口和抽象类的区别,分别在什么时候使用

    在C#中,接口和抽象类都可用于创建可由子类实现和继承的规范。尽管它们有相似之处,但在使用场景和行为上存在显著差异。以下是你需要知道的接口和抽象类的区别以及它们各自的使用场景: 定义与目的 : 接口(Interface) :接口定义了一组方法的签名,但不包含方法的

    2024年01月20日
    浏览(32)
  • C#中 Invoke和BeginInvoke的区别详解

    一、Invoke和BeginInvoke方法,主要用于子线程操作主线程UI的控件,修改控件属性等。 (1)Invoke同步运行,会等待代码运行完之后返回,线程会阻塞。 (2)BeginInvoke异步运行,调用之后立即返回,不会等待修改控件代码执行完。不会阻塞。 故由上述可知,Invoke和BeginInvoke方法由

    2024年01月19日
    浏览(30)
  • ArcGis Pro如何通过C#进行插件开发?

      ArcGIS Pro插件(Add-ins)可以让用户更加容易的自定义和扩展ArcGIS Pro应用程序,它创建一系列自定义工具提供了一个公开的基础框架,打包压缩成了一个单独的文件。 Add-ins插件能够很方便的在用户之间共享,因为它们既不需要安装程序 ,也不需要组件模型(COM)注册。本

    2024年02月12日
    浏览(96)
  • C++和C#程序语言的区别

    一直学习C++和C#,两者之间的区别总结一下 目录 一、两种语言概述 C++语言 C#语言 二、两种语言对比 2.1

    2024年02月09日
    浏览(30)
  • C# SolidWorks 二次开发 -从零开始创建一个插件(2)

    上一篇我详细讲解了如何创建一个插件,但是无界面无按钮,这种插件适合配合事件偷偷的在后台做点什么事情。今天这篇讲一下如何增加一些按钮到工具栏、菜单上去。 先告诉大家这个东西注册表在哪,因为solidworks在这方面做的不太好,插件你改个名字,就有多个工具栏

    2024年02月15日
    浏览(41)
  • 安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性

    DW + PHPStorm + PhpStudy + Navicat Premium DW : HTMLJSCSS开发 PHPStorm : 专业PHP开发IDE PhpStudy :Apache MYSQL环境 Navicat Premium: 全能数据库管理工具 1、数据库名,数据库表名,数据库列名 2、数据库数据,格式类型,长度,键等 PHP函数:连接,选择,执行,结果,关闭等 参考:https://www.runoo

    2024年02月17日
    浏览(44)
  • 前端小白科普:小程序组件与插件有啥区别?怎么用?

    一直以为小程序组件和小程序插件是一回事,只是措辞不一样,导致造成乌龙,其实完全是两回事,插件是可以直接提供服务的,组件是给开发者提供的轮子,不能直接提供服务。 先看看微信是如何定义小程序插件的: 小程序插件是可被添加到小程序内直接使用的功能组件

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包