C# 友元程序集

1.友元程序集

使用友元程序集可以将internal成员提供给其他的友元程序集访问。
程序集FriendTest1.dll

[assembly:InternalsVisibleTo("FriendTest2")]
namespace FriendTest1
{internal class Friend{string name;public string Name => name;public Friend(string name){this.name = name;}public void FriendInfo(){Console.WriteLine("我的盆友叫" + name);}}
}

程序集FriendTest2.dll

namespace FriendTest2
{public class FriendCall{public static void Raise(){Friend friend = new Friend("小明");friend.FriendInfo();}}
}

调用

static void Main(string[] args)
{FriendCall.Raise();
}

2.强命名友元程序集

强名称是一种为程序集提供唯一标识的机制,它包括程序集的文件名、版本号、语言文化信息和公钥。强名称可以保证程序集的名称的全局唯一性,防止程序集被篡改或伪造,以及实现版本控制和安全策略。

友元程序集是指一个程序集可以访问另一个程序集中的内部或友元类型和成员的程序集。强命名是一种为程序集提供唯一标识的机制,它包括一个公钥和一个数字签名。

友元程序集强命名有以下作用:

  • 可以保护程序集的版本沿袭。强命名可以确保没有人能够生成你的程序集的后续版本,或者冒充你的程序集。
  • 可以防止程序集冲突。强命名可以确保不会出现具有相同简单名称的程序集的冲突,因为每个强命名程序集都有一个唯一的公钥标记。
  • 可以实现类型共享。友元程序集可以让你在不将类型和成员标记为公共的情况下,与其他程序集共享你的程序集中的内部 (C#) 或友元 (Visual Basic) 类型和成员¹。这在单元测试或类库开发的情况下很有用。

要为程序集签署强名称,你需要有一个公钥/私钥对

2.1 生成密钥对

1.打开开发者命令提示
在这里插入图片描述

2.输入指令sn -k keypair.snk
创建成功如下所示:
在这里插入图片描述
参考: 微软官方链接

2.2 强命名签名

1.项目-属性
在这里插入图片描述

生成-强命名-浏览
在这里插入图片描述

选择刚刚生成的keypair.snk
在这里插入图片描述

如下所示:
在这里插入图片描述

将程序集生成后将dll文件放在和keypair.snk一个文件夹下
在这里插入图片描述

输入指令检查 sn -v StrongFriendTest1.dll 是否签名
成功如下所示:
在这里插入图片描述

2.3 获取公钥

输入指令sn -Tp StrongFriendTest1.dll
在这里插入图片描述

2.4 使用公钥

StrongFriendTest1代码如下

[assembly: InternalsVisibleTo("StrongFriendTest2, PublicKey=002400000480000094000000060200000024000052534131000400000100010029c540153df28b" +"7eb8bf322367b2ec864003ecb35cdfbe10651302912044d36d4f3ed108d2fcde368e56ea778f7e" +"e324761c534c3de2d3121ec0a91f1e6ba62e0612dbc389b444bc6faaf0c8a5a961b9381948f7de" +"f3ffaddb775324a42d7444c924733eb7a6bd2c4d1cb15b4bfe38fb17911af830638ba866bedf2f" +"f32b5ed8")]
namespace StrongFriendTest1
{internal class StrongFriend{string name;public string Name => name;public StrongFriend(string name){this.name = name;}public void StrongFriendInfo(){Console.WriteLine("我的强命名朋友叫" + name);}}
}

2.5 调用强命名友元

调用的前提是两个程序集都共用一个密钥签名
为StrongFriendTest2添加密钥签名参考上面2.2 ,其代码如下:

using StrongFriendTest1;namespace StrongFriendTest2
{public class StrongFriendCall{public static void Raise(){StrongFriend strongFriend = new StrongFriend("大明");strongFriend.StrongFriendInfo();}}
}

main函数调用

using FriendTest2;
using StrongFriendTest2;
namespace FriendTest
{internal class Program{static void Main(string[] args){FriendCall.Raise();StrongFriendCall.Raise();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言第三十九弹--判断闰年and打印1000-2000之间闰年

使用C语言判断闰年and打印1000-2000之间闰年 普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。 世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年&a…

手敲myarraylist,深入了解其运行逻辑

1、自定义MyArrayList类 该类里面基本有两个属性,一个是用来存放数据的数组,另外一个是用来描述已经存放数据的数量。同时设置arraylist表的默认长度为10;代码如下: public class MyArrayList {private int[] elem;private int u…

kubernetes七层负载Ingress搭建(K8S1.23.5)

首先附上K8S版本及Ingress版本对照 Ingress介绍 NotePort:该方式的缺点是会占用很多集群机器的端口,当集群服务变多时,这个缺点就愈发的明显(srevice变多,需要的端口就需要多) LoadBalancer:该方式的缺点是每个servi…

Retrofit中的注解

一、Retrofit中的注解有那些? 方法注解:GET ,POST,PUT,DELETE,PATH,HEAD,OPTIONS,HTTP标记注解:FormUrlEncoded,Multpart,Streaming参数注解:Query,QueryMap,Body,Field…

2336. 无限集中的最小数字 --力扣 --JAVA

题目 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, ...] 。 实现 SmallestInfiniteSet 类: SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。int popSmallest() 移除 并返回该无限集中的最小整数。void addBack(int num) 如果正整数 n…

informer 辅助笔记:main_informer.py

运行 informer的主文件 import argparse import os import torchfrom exp.exp_informer import Exp_Informer 1 参数 parser.add_argument的这些 参数名称参数描述model实验模型。可以设置为informer、informerstack、informerlight(TBD)data数据集名称root_path数据文件的…

JSP+servlet实现高校社团管理系统

JSPservlet实现的高校社团管理系统 ,前后台都有,前台演示地址:高校社团管理系统 后台演示地址:登录 用户名:sys,密码:123456 前台功能:首页,社团列表,社团风采,社团活动,新闻列表&#xff0c…

阿里云新版公共实例从注册账号到创建设备生成参数教程

1 注册阿里云 打开阿里云官网,点击右上角的登录/注册 打开的界面按照图片输入手机号注册 注册成功后,登录返回第一次打开的界面,点击控制台 点击控制台后界面如下 点击左上角的菜单,弹出新窗口,搜索物联网平台 开通物…

在Django中使用Q对象和条件运算符来构建动态查询

示例代码,展示了如何根据cost_min和cost_max的值构建查询条件: from django.db.models import Q# 构建查询条件 query Q() # 创建一个空的Q对象# 添加单价范围查询条件 if cost_min is not None:query & Q(UnitCost__gtecost_min) # 添加大于等于…

springmvc(基础学习整合)

SpringMVC是Spring框架提供的构建Web应用程序的全功能MVC模块。 在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。 springMVC基本介绍: http://t.csdnimg.cn/TOzw9 MVC是一种设计思想,将一个应…

AcWing 3555:二叉树(多次询问两个结点之间的最短路径长度) ← DFS

【题目来源】https://www.acwing.com/problem/content/3558/【题目描述】 给定一个 n 个结点(编号 1∼n)构成的二叉树,其根结点为 1 号点。 进行 m 次询问,每次询问两个结点之间的最短路径长度。 树中所有边长均为 1。【输入格式】…

华为云cce容器管理中的调度策略作用

研究不深,但是这个还是挺重要的,在这里记录一下。 在cce节点集群中,有时候会发现有的节点实例过于饱满,有的又有些空,导致部分节点由于压力过大,存在崩溃的危险,这时候调度策略就有用了。 我这…

图扑参展高交会-全球清洁能源创新博览会

“相聚鹏城深圳,共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

nvm for windows使用与node/npm/yarn的配置

1 下载 nvm for windows download – github 下拉到Assets, 下载.exe文件 2 安装 安装到如下文件夹中 目录可以自己选, 可以换别的名字, 自己记住即可 新手建议全部看完再进行个人配置, 或者使用与博主一致的路径 D:\DevelopEnvironment\nvm3 配置nvm使用的镜像 node_mir…

值得收藏的免费好用API

短信验证码:可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商,3秒可达,99.99%到达率,支持大容量高并发。通知短信:当您需要快速通知用户时,通知短信是最快捷有效的方式。短信…

Carbonyl ,一个可以在终端里运行的浏览器

浏览器对于我们的日常来说是使用频率比较高的一个东西。 一般来说,对于桌面的发行版的linux的浏览器,用的比较多的是Firefox浏览器。对于我们日常windows、mac等。常用的有chrome、edge等。 但是!在终端里运行一个浏览器,我想大多…

SaaS模式C/S检验科LIS系统源码

适用于医院检验科实际需要的管理系统, 实现检验业务全流程的计算机管理。从检验申请、标本编号、联机采集、中文报告单的生成与打印、质控图的绘制和数据的检索与备份。通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接,实现与医院HIS系统的对接。 通过门诊医生和住…

HTML-CSS知识速查

HTML/CSS知识速查 文章目录 HTML/CSS知识速查[toc]网页的组成浏览器**为什么需要Web标准:** **web标准的构成:**HTMLHTML语法导读**1.1 HTML语法规则:**1.2 基本结构标签**1.3 标签的关系:**1. **包含关系(Parent-Chil…

java并发编程(一)----初识

一、什么是并发 先看“科普中国”给出的官方解释。并发在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。 通俗来讲&#xff0c…

岩土工程监测新利器——振弦采集仪

岩土工程监测新利器——振弦采集仪 振弦采集仪是一种常用的岩土工程监测仪器,主要用于测量岩土体的振动和应变情况。它采用先进的数字信号处理技术,可以实时采集和处理振弦信号,快速准确地获取岩土体的振动和应变信息。 振弦采集仪具有以下优…