当前位置: 首页 > news >正文

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();}}
}

相关文章:

  • 225. 用队列实现栈 --力扣 --JAVA
  • linux下实现Qt程序实现开机自启动
  • LeetCode [简单](非递归)二叉树的中序遍历
  • Python爬虫遇到重定向URL问题时如何解决?
  • [密码学]DES
  • 【九日集训】第五天:排序
  • VSCode 代码调试
  • 使用Golang构建高性能网络爬虫
  • MGF4964BL-01 低噪声 InGaAs HEMT(高电子迁移率晶体管) K波段放大器 微X型塑料封装
  • C++模拟实现unordered_map和unordered_set
  • 【探索Linux】—— 强大的命令行工具 P.18(进程信号 —— 信号捕捉 | 信号处理 | sigaction() )
  • C++基础 -21-多继承与多级继承
  • 记一篇Centos7安装innodb_ruby
  • 企业微信应用文本消息
  • Android笔记(十四):JetPack Compose中附带效应(一)
  • [译] 怎样写一个基础的编译器
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • flask接收请求并推入栈
  • input的行数自动增减
  • Java 内存分配及垃圾回收机制初探
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JSDuck 与 AngularJS 融合技巧
  • underscore源码剖析之整体架构
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 关于List、List?、ListObject的区别
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 前端性能优化——回流与重绘
  • 前言-如何学习区块链
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 思考 CSS 架构
  • 网络应用优化——时延与带宽
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (9)STL算法之逆转旋转
  • (C++20) consteval立即函数
  • (Forward) Music Player: From UI Proposal to Code
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .Net Winform开发笔记(一)
  • .net 验证控件和javaScript的冲突问题
  • .net6Api后台+uniapp导出Excel
  • .net对接阿里云CSB服务