当前位置: 首页 > 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();}}
}

相关文章:

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不可变集合 不可变集合:也就是不可以被修改的集合 创建不可变集合的应用场景 ●如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践。 ●当集合对象被不可信的库调用时,不可变形式是安全的。 简单理解&#xff1…...

openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复

文章目录 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复146.1 背景信息146.2 前置条件146.3 操作步骤146.4 示例 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复 146.1 背景信息 在openGauss使用过程中&#x…...

一文读懂中间件

前言:在程序猿的日常工作中, 经常会提到中间件,然而大家对中间件的理解并不一致,导致了一些不必要的分歧和误解。“中间件”一词被用来描述各种各样的软件产品,在不同文献中有着许多不同的中间件定义,包括操…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 ​ 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...