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();}}
}
相关文章:
C# 友元程序集
1.友元程序集 使用友元程序集可以将internal成员提供给其他的友元程序集访问。 程序集FriendTest1.dll [assembly:InternalsVisibleTo("FriendTest2")] namespace FriendTest1 {internal class Friend{string name;public string Name > name;public Friend(str…...
CRM系统的数据分析和报表功能对企业重要吗?
竞争日益激烈,企业需要更加高效地管理客户关系,以获取更多的商机。为此,许多企业选择使用CRM系统。在CRM中,数据分析功能扮演着重要的角色。下面就来详细说说,CRM系统数据分析与报表功能对企业来说重要吗? …...
【单体架构事务失效解决方式之___代理对象加锁】
单体架构__用户限买 一个id一单的多线程事务失效问题解决 背景介绍:有一种情况,我们在使用Synchronized的时候出现失效情况。 经过排查,是因为使用了this.当前对象,他现在使用的是目标对象加锁失效,使用代理对象加锁就…...
面试被问到 HTTP和HTTPS的区别有哪些?你该如何回答~
HTTP和HTTPS的区别有哪些,主要从以下几个方面来说: 1.安全性 HTTP和HTTPS是两种不同的协议,它们之间最主要的区别在于安全性。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,容易被攻击者截取信息。 HTTPS则在…...
点评项目——短信登陆模块
2023.12.6 短信登陆如果基于session来实现,会存在session共享问题:多台Tomcat不能共享session存储空间,这会导致当请求切换到不同服务器时出现数据丢失的问题。 早期的解决办法是让session提供一个数据拷贝的功能,即让各个Tomcat的…...
2023亚太地区五岳杯量子计算挑战赛
计算电源网 (CPN)布局优化 1. 介绍 计算能力网络 (CPN)是一种基于业务需求分配和调度计算资源的新型信息基础设施,计算资源通常由终端用户、边缘服务器和云服务器组成。该网络旨在满足各种计算任务的需求。根据计算需求的空间分…...
Python 模块的使用方法
Python 模块是一种组织和封装代码的方式,允许你将相关的功能和变量放在一个单独的文件中,以便在其他程序中重复使用。在Python中,模块是一种可执行的Python脚本,其文件扩展名为 .py。这里,我将详细讲解Python模块的使用…...
【知识】稀疏矩阵是否比密集矩阵更高效?
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 问题提出 有些地方说,稀疏图比密集图的计算效率更高,真的吗? 原因猜想 这里的效率高,应该是有前提的:当使用稀疏矩阵的存储格式(如CSR)时,计…...
代码随想Day24 | 回溯法模板、77. 组合
理论基础 回溯法和递归不可分割,回溯法是一种穷举的方法,通常需要剪枝来降低复杂度。回溯法有一个选择并退回的过程,可以抽象为树结构,回溯法的模板如下: void backtracking(参数) {if (终止条件) {存放结果;return;}…...
搜索与回溯算法②
求0-9的数字可以组成的所有k 位数。 def backtrack(start, path, k, n, results):"""核心函数。:param start: 下一个添加的数字的起始位置:param path: 当前构建的路径,代表一个组合:param k: 组合中所需的数字个数:param n: 可选数字的最大值:par…...
Centos图形化界面封装OpenStack Ubuntu镜像
目录 背景 环境 搭建kvm环境 安装ubuntu虚机 虚机设置 系统安装 登录虚机 安装cloud-init 安装cloud-utils-growpart 关闭实例 删除细节信息 删除网卡细节 使虚机脱离libvirt纳管 结束与验证 压缩与转移 验证是否能够正常运行 背景 一般的镜像文件在上传OpenSt…...
使用Jmeter进行http接口测试怎么做?
前言: 本文主要针对http接口进行测试,使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接口的测试。 一、开发接…...
创建腾讯云存储桶---上传图片--使用cos-sdk完成上传
创建腾讯云存储桶—上传图片 注册腾讯云账号https://cloud.tencent.com/login 登录成功,选择右边的控制台 点击云产品,选择对象存储 创建存储桶 填写名称,选择公有读,私有写一直下一步,到创建 选择安全管理&#…...
12.3_黑马MybatisPlus笔记(上)
目录 02 03 04 05 06 07 编辑 thinking:system.out::println?编辑 thinking:list.of? 08 thinking:RequestParam和 ApiParam注解使用? thinking:RequestParam 和PathVariable的区别? 编辑 编…...
智能优化算法应用:基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.寄生捕食算法4.实验参数设定5.算法结果6.参考…...
全息图着色器插件:Hologram Shaders Pro for URP, HDRP Built-in
8个新的Unity全息图着色器,具有故障效果,扫描线,网格线,和更多其他效果!与所有渲染管线兼容。 软件包添加了一系列的全息图着色器到Unity。从基本的全息图与菲涅耳亮点,先进的全息图与两种故障效应,扫描线,文体点阵和网格线全息图! 特色全息效果 Basic-支持菲涅耳发光照…...
Python Opencv实践 - 简单的AR项目
这个简单的AR项目效果是,通过给定一张静态图片作为要视频中要替换的目标物品,当在视频中检测到图片中的物体时,通过单应矩阵做投影,将视频中的物体替换成一段视频播放。这个项目的所有素材来自自己的手机拍的视频。 静态图片&…...
Java不可变集合
Java不可变集合 不可变集合:也就是不可以被修改的集合 创建不可变集合的应用场景 ●如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践。 ●当集合对象被不可信的库调用时,不可变形式是安全的。 简单理解࿱…...
openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复
文章目录 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复146.1 背景信息146.2 前置条件146.3 操作步骤146.4 示例 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复 146.1 背景信息 在openGauss使用过程中&#x…...
一文读懂中间件
前言:在程序猿的日常工作中, 经常会提到中间件,然而大家对中间件的理解并不一致,导致了一些不必要的分歧和误解。“中间件”一词被用来描述各种各样的软件产品,在不同文献中有着许多不同的中间件定义,包括操…...
C语言结构体:从‘学生信息管理‘到‘链表实现‘的保姆级跃迁指南(含typedef避坑)
C语言结构体:从学生信息管理到链表实现的实战进阶 在C语言的世界里,结构体就像是一个神奇的收纳盒,它能够将不同类型的数据打包成一个整体。想象一下,当你需要管理学生信息时,不再需要为姓名、学号、成绩等分别定义变量…...
别再用游戏卡炼丹了!手把手教你给台式机装上Tesla P4/P40,搞定Ubuntu 20.04深度学习环境
低成本打造专业级AI工作站:Tesla P4/P40在Ubuntu 20.04的完整实战指南 当你在二手市场以不到2000元的价格淘到一张Tesla P40时,可能会被它12GB GDDR5显存和3840个CUDA核心的参数所吸引——这相当于RTX 2080 Ti约70%的性能,价格却只有其三分之…...
2026中级注册安全工程师全套备考资料|零基础直接上岸(讲义+视频+真题+押题)
很多备考注安的同学都踩过坑:资料杂乱、版本老旧、视频断断续续、考点找不到重点、整理资料耗费大量时间!为了帮大家省去筛选、找资源、整理笔记的时间,我全套整理好了2026最新中级注安备考大礼包,四科全覆盖、零基础可用、直接打…...
layerJS与现代前端框架集成:Vue、React、Angular中的最佳实践指南 [特殊字符]
layerJS与现代前端框架集成:Vue、React、Angular中的最佳实践指南 🚀 【免费下载链接】layerJS layerJS: Javascript UI composition framework 项目地址: https://gitcode.com/gh_mirrors/la/layerJS layerJS是一个创新的JavaScript UI组合框架&…...
OpenClaw 对接企业微信实操教程 完整配置流程
OpenClaw 绑定企业微信教程 OpenClaw 连接企业微信图文教程 前置准备 已安装并可以正常打开 OpenClaw Windows。OpenClaw 顶部 Gateway 状态保持在线。已安装并登录企业微信客户端。当前企业微信账号具备创建和管理智能机器人的权限。准备一个可用于测试的企业微信账号或群聊…...
J-Link V8变砖别慌!手把手教你用SAM-BA 2.14救活AT91SAM7S64芯片
J-Link V8救砖实战:用SAM-BA 2.14拯救AT91SAM7S64芯片全指南 当你的J-Link V8调试器突然"变砖"——LED灯熄灭、电脑无法识别、所有功能瘫痪时,那种感觉就像外科医生在手术台上突然失去所有仪器。但别急着宣布它的"死亡",…...
Python图像转二维数组:PIL与NumPy实战指南
1. 项目概述:从图片到数据的桥梁在图像处理、机器学习或者嵌入式开发的很多场景里,我们常常需要将一张图片“翻译”成计算机能直接理解和运算的数字形式。比如,你想分析一张照片的亮度分布,或者把一个简单的图标转换成单片机可以显…...
别慌!Pygame里time.sleep()报错?用Clock.tick()轻松搞定(附完整代码示例)
Pygame时间控制革命:为什么Clock.tick()比time.sleep()更适合游戏开发 在Pygame游戏开发的世界里,时间控制是构建流畅游戏体验的核心要素。许多初学者在从Python标准库转向Pygame时,常常会本能地使用time.sleep()来控制游戏节奏,却…...
TSN网络仿真入门:除了OMNeT++,这几个开源框架(NeSTiNg/CoRE4INET)到底该怎么选?
TSN网络仿真框架深度选型指南:从OMNeT生态到实战避坑 引言:当TSN遇见仿真工具丛林 在工业自动化与车载网络领域,时间敏感网络(TSN)正成为实时通信的基础设施。但部署前的验证环节往往让研究者陷入两难——直接搭建物理测试床成本高昂…...
终极Citra 3DS模拟器完整指南:在电脑上免费畅玩任天堂3DS游戏
终极Citra 3DS模拟器完整指南:在电脑上免费畅玩任天堂3DS游戏 【免费下载链接】citra A Nintendo 3DS Emulator 项目地址: https://gitcode.com/GitHub_Trending/ci/citra 想要在电脑上重温《精灵宝可梦》系列、《塞尔达传说》等经典3DS游戏吗?Ci…...
