在 MFC 中如何验证 C# 强命名库

news2024/12/15 21:10:03

在 MFC 中如何验证 C# 强命名库

在开发过程中,强命名程序集是 C# 项目中常见的一种安全机制,通过它可以唯一标识程序集的来源和版本。如果需要在 MFC 中调用并验证一个强命名的 C# 库,就需要深入了解强命名机制以及如何获取和验证强命名程序集的标记信息(PublicKeyToken)。本文将详细介绍如何操作以及其中的注意事项。


1. 什么是强命名程序集?

强命名程序集是通过使用公钥对程序集进行签名的特殊程序集,它具有以下特性:

  1. 唯一标识:强命名程序集依赖于公钥标记(PublicKeyToken),可以唯一标识程序集。
  2. 安全性:签名机制确保程序集不能被篡改。
  3. 全局程序集缓存(GAC):强命名程序集可以被部署到 GAC 中,供多个应用程序共享。

一个典型的强命名程序集的完整标识包括:

  • 程序集名称
  • 版本号
  • 文化
  • 公钥标记(PublicKeyToken

例如:

YourStrongNamedAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

2. PublicKeyToken 的作用

PublicKeyToken 是公钥的简化形式(通常为 8 字节的十六进制字符串),它是程序集强命名签名的重要部分,用于标识程序集的签名唯一性。例如,31bf3856ad364e35 是一个典型的 PublicKeyToken。


3. 如何获取 PublicKeyToken?

方法 1:使用 sn.exe 工具

.NET 提供了 sn.exe(Strong Name Utility),这是获取 PublicKeyToken 最常用的方法。

  1. 打开 Visual Studio 提供的开发者命令提示符(Developer Command Prompt)。
  2. 运行以下命令来检查程序集的 PublicKeyToken:
    sn -T YourStrongNamedAssembly.dll
    
  3. 输出示例:
    Microsoft (R) .NET Framework Strong Name Utility  Version 4.8.3928.0
    Copyright (c) Microsoft Corporation.  All rights reserved.
    
    Public key token is 31bf3856ad364e35
    

方法 2:使用 PowerShell 脚本

在现代 Windows 环境中,可以使用 PowerShell 动态加载程序集并查看 PublicKeyToken。

  1. 打开 PowerShell。
  2. 输入以下命令加载程序集并获取其 PublicKeyToken:
    [Reflection.Assembly]::LoadFile("C:\path\to\YourStrongNamedAssembly.dll").FullName
    
  3. 输出示例:
    YourStrongNamedAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
    

方法 3:使用 C++/CLI 代码动态获取

如果您需要在程序中动态加载程序集并获取 PublicKeyToken,可以使用以下代码:

#using <mscorlib.dll>
#include <iostream>
using namespace System;
using namespace System::Reflection;

void GetPublicKeyToken(String^ assemblyPath)
{
    try
    {
        // 动态加载程序集
        Assembly^ assembly = Assembly::LoadFrom(assemblyPath);
        array<unsigned char>^ publicKeyToken = assembly->GetName()->GetPublicKeyToken();

        // 输出 PublicKeyToken
        Console::Write("Public Key Token: ");
        for (int i = 0; i < publicKeyToken->Length; i++)
        {
            Console::Write(publicKeyToken[i].ToString("x2")); // 转换为十六进制
        }
        Console::WriteLine();
    }
    catch (Exception^ ex)
    {
        Console::WriteLine("Error: " + ex->Message);
    }
}

编译后运行此程序即可查看指定程序集的 PublicKeyToken。


方法 4:反编译工具

您也可以使用反编译工具(如 ILSpy 或 dotPeek)来查看程序集的元数据。PublicKeyToken 通常包含在程序集的元信息中。


4. 验证强命名程序集

在 MFC 项目中,通过 Assembly::Load 方法可以验证强命名程序集的版本和 PublicKeyToken。

示例代码

以下代码展示了如何加载和验证强命名程序集:

#using <mscorlib.dll>
#include <iostream>

using namespace System;
using namespace System::Reflection;

void LoadAssemblyAndCheckVersion()
{
    try
    {
        // 指定要加载的程序集信息
        String^ assemblyInfo = "YourStrongNamedAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35";

        // 加载程序集
        Assembly^ assembly = Assembly::Load(assemblyInfo);

        // 获取实际加载的版本号
        Version^ version = assembly->GetName()->Version;
        Console::WriteLine("Loaded Assembly Version: " + version);

        // 检查版本号是否匹配
        if (version->ToString() == "1.0.0.0")
        {
            Console::WriteLine("Version matches!");
        }
        else
        {
            Console::WriteLine("Version mismatch!");
        }
    }
    catch (Exception^ ex)
    {
        Console::WriteLine("Error: " + ex->Message);
    }
}

如果加载失败(例如版本不匹配或 PublicKeyToken 不正确),CLR 会抛出异常,例如 FileLoadException


5. 注意事项

  1. 版本和签名验证:

    • Assembly::Load 方法中指定的版本号和 PublicKeyToken 必须与实际程序集匹配。
    • 如果签名不正确或版本不匹配,CLR 将拒绝加载程序集。
  2. 程序集绑定重定向:
    如果程序中涉及多个版本的程序集,可能需要配置程序集绑定重定向。可以通过 app.config 文件指定重定向规则。

  3. 捕获异常:
    始终捕获加载过程中的异常,并输出详细的错误信息,便于调试。


总结

通过本文介绍的方法,您可以轻松获取强命名程序集的 PublicKeyToken,并在 MFC 项目中对其进行验证。无论是使用工具如 sn.exe 或动态代码加载,都可以确保加载的是正确的版本和签名的程序集。这种机制不仅提高了程序集的安全性,还确保了程序集之间的兼容性。

希望本文能帮助您更好地理解和使用强命名程序集!如果有其他问题,欢迎留言讨论! 😊

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

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

相关文章

[C#与C++交互] 跨进程通信NamedPipes

目录 1、前言 2、什么是命名管道&#xff1f; 3、实现步骤 4、示例代码 4.1 C 服务器代码 4.2 C# 客户端代码 5、运行步骤 6、注意事项 7、应用场景 8、优缺点 9、总结 1、前言 在 C# 和 C 应用程序之间进行数据交换时&#xff0c;命名管道&#xff08;Named Pipes…

ubuntu+ros新手笔记(三)

系统ubuntu22.04 ros2 humble 1. 设置ubuntu终端字体大小 点击Terminal右上角的三条横线—>Preferences—>Unnamed—>Text—>勾选Custom font—>点击右侧的字号&#xff08;我的显示的是12&#xff09;—>最下方Size处设置字号大小—>Select—>设置完…

使用echarts实现3d柱状图+折线图

以下代码有问题请直接问国内直连GPT/Claude HTML 需要注意threeDchart一定要设置宽度高度&#xff0c;不然图不显示,然后echarts版本不要太低&#xff0c;不然也不显示 <div id"threeDchart" class"threeDchart"></div>js set3DBarChart2(dat…

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇 2024年的蓝桥杯即将拉开序幕&#xff01;对于许多编程爱好者来说&#xff0c;这不仅是一次展示自我能力的舞台&#xff0c;更是一次学习和成长的机会。作为一名大一新生的小蓝&#xff0c;对蓝桥杯充满了期待&#xff0c;但面对初次参赛的…

计算机毕业设计PySpark+PyFlink+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Hadoop 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【Python】使用Selenium的find_element模块获取网页上的大段文字和表格的方法(建议收藏!)

发现了一个使用Selenium的find_element模块&#xff0c;快速获取文字和表格的方法&#xff0c;很实在&#xff0c;以后爬网的时候&#xff0c;就不用beautifulSoup 和 pandas的read_html 混起来用了&#xff01; 文字部分&#xff1a;实现网络节点下&#xff0c;某个节点下的其…

Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告Gherkin格式命令行报告

Pytest-Bdd-Playwright 系列教程&#xff08;16&#xff09;&#xff1a;标准化JSON报告&Gherkin格式命令行报告 前言一、创建Feature文件二、创建步骤定义文件三、生成Cucumber格式的JSON报告四、使用Gherkin格式的命令行报告五、将BDD报告集成到Jenkins中总结 前言 在自动…

HDR视频技术之七:逆色调映射

HDR 技术近年来发展迅猛&#xff0c;在未来将会成为图像与视频领域的主流。当前 HDR 内容非常短缺&#xff0c;限制了 HDR 视听节目的广泛应用。逆色调映射(Inverse Tone Mapping)应运而生&#xff0c;它是一种用来将 SDR 源信号转换为 HDR 源信号的技术&#xff0c;可以应用于…

迎接全新的 Kotlin 支持 – K2 模式:基本信息

K2 模式有什么作用&#xff1f; K2 模式是 IntelliJ IDEA 中 Kotlin 支持的新实现&#xff0c;它可以提高 IDE 的稳定性&#xff0c;同时也会为支持未来 Kotlin 语言功能奠定基础。 K2 模式与 Kotlin K2 编译器有什么区别&#xff1f; K2 编译器负责编译 Kotlin 语言 2.0 或…

黑马程序员Java项目实战《苍穹外卖》Day12

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现&#xff1a;工作台、数据导出 工作台效果图&#xff1a; 数据导出效果图&#xff1a; 在数据统计页面点击数据导出&#xff1a;生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原…

活动报名:Voice Agent 开发者分享会丨RTE Meetup

引入 voice agent 的口语学习应用 Speak 估值已达 10 亿美元 Voice Agent 开发者分享会 一同探索语音驱动的下一代人机交互界面&#xff0c;一场 voice agent builder 的小规模深度交流会。 RTE Meetup 迎来第六期&#xff01;12 月 15 日&#xff08;周日&#xff09;上午&…

优化你的 3D Tiles:性能与质量的平衡

优化你的 3D Tiles&#xff1a;性能与质量的平衡 在现代的三维场景渲染中&#xff0c;3D Tiles 是一种强大的技术&#xff0c;它能以高效、分级加载的方式呈现海量的三维数据。然而&#xff0c;优化 3D Tiles 以实现性能与质量的平衡&#xff0c;却是一个复杂且关键的任务。本…

【K8S系列】在 Kubernetes 中使用 Prometheus 进行监控的详细指南

Prometheus 是一个开源的监控和报警工具&#xff0c;广泛用于 Kubernetes 环境中。本文将深入探讨如何通过 Kubernetes 中的注解配置 Prometheus 的抓取设置&#xff0c;以高效监控服务&#xff0c;并确保系统的可靠性和可维护性。 一、Prometheus 简介 Prometheus 是一个功能…

SEC_ASA 第一天作业

拓扑&#xff1a; 实验需求&#xff1a; 注意&#xff1a;在开始作业之前必须先读“前言”&#xff0c;以免踩坑&#xff01;&#xff01;&#xff01;&#xff08;☞敢点我试试&#xff09; 按照拓扑图配置VLAN连接。 注意&#xff1a;ASA防火墙的 Gi0/1口需要起子接口&#x…

基于STM32设计的工地扬尘与噪音实时监测系统(网页)

一、前言 当前项目使用的相关软件工具、传感器源代码工程已经上传到网盘&#xff08;实时更新项目内容&#xff09;&#xff1a;https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?fromfrom_copylink 1.1 项目开发背景 近年来&#xff0c;随着城市化进程的…

Vue项目打包部署到服务器

1. Vue项目打包部署到服务器 1.1. 配置 &#xff08;1&#xff09;修改package.json文件同级目录下的vue.config.js文件。 // vue.config.js module.exports {publicPath: ./, }&#xff08;2&#xff09;检查router下的index.js文件下配置的mode模式。   检查如果模式改…

KMP 字符串匹配详解

一、KMP 的作用 KMP 用于解决字符串匹配问题&#xff0c;当出现字符串不匹配时&#xff0c;可以知道一部分之前已经匹配的文本内容&#xff0c;可以利用这些信息避免从头再去做匹配了。 二、题目 链接&#xff1a;28. 找出字符串中第一个匹配项的下标 - 力扣&#xff08;Lee…

ElasticSearch01-概述

零、文章目录 ElasticSearch01-概述 1、Elastic Stack &#xff08;1&#xff09;简介 官网地址&#xff1a;https://www.elastic.co/cn/ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际…

12.2【JAVA EXP4]next.js的各种问题,DEBUG,前端补强,前后端交互,springSecurity ,java 配置,h2数据库

在服务器组件中使用了 useState 这样的 React Hook。useState 只能在客户端组件中使用&#xff0c;而不能在服务器组件中使用。Next.js 的新架构&#xff08;App Router&#xff09;中&#xff0c;默认情况下&#xff0c;页面和布局组件是服务器组件&#xff0c;因此不能直接使…

MySQL相关文件

配置文件 — — — — — — /etc/my.cnf datadir/var/lib/mysql //数据目录 socket/var/lib/mysql/mysql.sock //定义套接字文件存储位置&#xff0c;套接字文件&#xff08;IP&#xff1a;port&#xff09;,用于接收客户端连…