C# 友元程序集

1.友元程序集

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

程序集FriendTest1.dll

csharp 复制代码
[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

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

调用

csharp 复制代码
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代码如下

csharp 复制代码
[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 ,其代码如下:

csharp 复制代码
using StrongFriendTest1;

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

main函数调用

csharp 复制代码
using FriendTest2;
using StrongFriendTest2;
namespace FriendTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            FriendCall.Raise();
            StrongFriendCall.Raise();
        }
    }
}
相关推荐
没钥匙的锁12 小时前
16-Java反射机制:Spring IOC背后的核心技术
java·开发语言·spring
起予者汝也2 小时前
Python 数据结构
开发语言·数据结构·python
ECT-OS-JiuHuaShan3 小时前
严格证明:还原论是ASCII,整体论是UTF-8的历史意义和价值
开发语言·人工智能·算法·量子计算
AC赳赳老秦4 小时前
时间开销自动统计:OpenClaw 记录工作任务时长、分析时间分配、给出优化建议
java·大数据·开发语言·python·自动化·deepseek·openclaw
鱼听禅4 小时前
C#学习笔记-Entity Framework Core基础操作学习
c#·orm·ef core
祉猷并茂,雯华若锦4 小时前
Appium 3.x 实战:元素定位与常见错误解析
开发语言·python·appium
Lethehong4 小时前
飞算Java:从需求梳理到风险闭环,搭建云盾企业信息安全与权限管理平台
java·开发语言
爱喝水的鱼丶4 小时前
SAP-ABAP:ALV数据导出增强——实现Excel/PDF/CSV多格式自定义导出
开发语言·性能优化·sap·abap·erp
Mortalbreeze5 小时前
深入理解 Linux 线程机制(四):线程同步——条件变量与信号量
linux·运维·服务器·开发语言·c++
不会c+5 小时前
C语言:入门到精通(408考研版)系列七 派生的数据类型
c语言·开发语言