.net中的如何私有部署强命名组件

VMware Workstation Pro 17 高效安装与激活指南 本文详细介绍了VMware Workstation Pro 17的高效安装与激活方法,包括系统要求、安装步骤、常见问题解决方案及性能优化技巧。通过专业的指导,帮助用户快速掌握这款强大的虚拟机软件,提升工作效率。 阅读详情

私有部署:何谓私有部署这是相对公有部署而言的,我们知道在安装了dotNetFramework的机器上%SystemRoot%/assembly(%SystemRoot%一般指系统Windows目录)目录中的文件是.net运行必需的组件,然而在我们自己的可执行程序中需要的组件,存放在程序的根目录下的dll组件(也称作程序集文件)。对这些文件的部署就称为私有部署。当然也可以部署到公用程序集缓存中(也称作GAC,若要部署GAC不能单纯的把dll复制到assembly目录,这里需要一个部署工具GACUtil.exe,关于这个工具的使用请查看MSDN,这里不在详细阐述)程序运行需要调用的组件 部署在程序根目录下。后面我会讲到如何组织dll组件。

开始我们的正式行程:

以下内容提到的程序集文件,dll,组件意义相同。

I:组件的创建

Ⅱ:可执行体程序

Ⅲ:你可以发现我的!~!(dll私有部署到根目录下的任意文件夹下)

Ⅳ:没人可以替换我!(dll/exe强命名,使用公钥/私钥给程序集签名,防篡改) 

I:组件的创建

这里我们首先编译一个dll组件(这里的代码无任何实用功能,仅作演示)

命令行执行csc.exe /out:Utildata.dll /t:library /r:Dataprovider.cs

得到UtilData.dll文件

using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  UtilData
{
    
public class DataProvider
    
{
        
public DataProvider() { }
        
public DataProvider(Int32 _id, String _name, String _sex)
        
{
            id 
= _id;
            name 
= _name;
            sex 
= _sex;
        }


        
private Int32 id;
        
private String name;
        
private String sex;

        
public Int32 ID
        
{
            
get return this.id; }
            
set if (value >= 0this.id = value; } }
        }

        
public String Name
        
{
            
get return this.name; }
            
set if (value != nullthis.name = value; } }
        }


        
public String Sex
        
{
            
get return this.sex; }
            
set if (value != nullthis.sex = value; } }
        }


        
public String GetDataProvider(Int32 id)
        
{
            
return "You id is:" + id.ToString();
        }


        
public override string ToString()
        
{
            
//return base.ToString();
            StringBuilder sb = new StringBuilder();
            sb.Append(
"My id:" + this.id);
            sb.Append(
"My name:" + this.name);
            sb.Append(
"My sex:" + this.sex);
            
return sb.ToString();
        }

        
    }

}

 

 Ⅱ:可执行体程序

创建winapplication窗体程序界面如下,添加引用,找到刚才生成的dll组件

Test按钮后台代码:

  // my code
        UtilData.DataProvider dp  =   null ;
        
private   void  btnCall_Click( object  sender, EventArgs e)
        
{
            dp 
= new UtilData.DataProvider(001"fang""man");
            MessageBox.Show(dp.ToString());
        }

生成项目,我们可以发现在项目debug目录结构如下:

Ⅲ:你可以发现我的!~!(dll私有部署到根目录下的任意文件夹下)

在实际应用中我们往往会吧dll组件分布在应用程序根目录下的不同文件夹下,我们应该如何做呢?

clr会找到运行时需要的组件吗?这就需要.config文件的支持了,在根目录新建一个和可执行程序同名的config文件,比如privatePublish.exe 的config文件文件名称为privatePublish.exe.config,clr在加载privatePublish.exe是会按照.config配置的信息运行程序。

privatePublish.exe.config文件,这里列的条目比较简单,详见MSDN,Lib就是存放dll组件的目录

如果有多个目录用分号分开(比如dll组件目录需要两个文件夹则privatePath="Lib;SupDll")clr会自动在寻找所需的程序集文件。

< configuration >
< runtime >
< assemblyBinding   xmlns ="urn:schemas-microsoft-com:asm.v1" >
< probing  privatePath ="Lib" />
</ assemblyBinding >
</ runtime >     
</ configuration >

目录结构

Ⅳ:没人可以替换我!(dll/exe强命名,使用公钥/私钥给程序集签名,防篡改) 

何谓强命名,一个强命名组件包含4个特性:组件名称,语言特性,版本,公钥标记,这4个特性可以唯一的确定程序集。

这里需要介绍个Sn.exe实用工具,它位于.net安装目录。(具体使用方法见MSDN)

我们的目的是要得到公钥标记,所以命令行执行

SN.exe -k myKey.keys          创建公钥/私钥对文件,程序集需要的就是它。

SN.exe -p mykey.keys mykey.publickey    依据公钥/私钥文件,创建公钥文件,为了下一步查看公钥 和公钥标记

SN.exe -tp mykey.pubilckey  控制台显示公钥和公钥标记  我的机器上运行此步骤截屏

要生产强命名的UtilData.dll文件执行如下命令行

csc.exe /out:Utildata.dll /t:library /keyfile:my.keys /r:Dataprovider.cs

这与之前生成的UtilData.dll唯一不同就是指定了keyfile:my.keys 开关。当然亦可以对exe文件添加添加同样的开关对exe也执行强命名

可以在项目属性属性—签名标签中指定keys文件对winexe文件签名

至此就完成了对程序集的私有部署+强命名

做个小试验验证下对强命名程序集的篡改会导致什么后果

Restorator 打开UtilData.dll,

点击保存~!我们对UtilData.dll进行了篡改。

我们运行PrivatePublish.exe   咯问题来了

为什么会这样呢,因为对程序集进行篡改了,修改的UtilData.dll的数据已经不能被调用它的程序集识别了,所以加载程序集出现了错误~!

一个代码循环计算水在石墨烯表面的接触角 石墨烯接触角 阅读详情

相关推荐

大模型之Spring AI实战系列(二十一):Spring AI + MCP + 本地文件系统实战指南

在上一篇文章中,我们学习了如何使用 Spring AI 集成 Model Context Protocol (MCP),并通过 Brave Search 实现了互联网搜索能力的接入。本文将继续深入 Spring AI 的 MCP 实战能力,介绍如何将 **本地文件系统** 封装为 LLM 可调用的工具

寻道AI,探索AI无限可能! 2465

.NET程序集强名称签名实践

强名称是由程序集的标识加上公钥和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该程序集的所有文件的名称和散列)生成的。Microsoft® Visual Studio® .NET 和在 .NET Framework SDK 中提供的其他开发工具能够将强名称分配给一个程序集。强名称

程序人生,学海无涯 2620

【WRF理论第十九期】内陆湖泊、水体的处理方式

【WRF理论第十九期】内陆湖泊、水体的处理方式

WW、forever的博客 320

Windows应用程序与配置文件

 Windows应用程序与配置文件         为每个应用程序提供一个配置文件已经不是什么新鲜的想法了,在早期的Windows中,许多程序通常都提供一个扩展名为“.ini”或“.dat”之类的物件以定制化程序或为应用程序提供扩展描述。Microsoft公布.NET框架后,基于Windows的exe文件有了一定的微妙的变化,这就是每个exe文件在.NET框架下匹配了一个“Config”文

让您的桌面应用拥有互联网基因 4713

[导入].net中的如何私有部署强命名组件

私有部署:何谓私有部署这是相对公有部署而言的,我们知道在安装了dotNetFramework的机器上%SystemRoot%\assembly(%SystemRoot%一般指系统Windows目录)目录中的文件是.net运行必需的组件,然而在我们自己的可执行程序中需要的组件,存放在程序的根目录下的dll组件(也称作程序集文件)。对这些文件的部署就称为私有部署。当然也可以部署到公用程序集缓...

weixin_30340745的博客 78

Shared Assembilies and Strongly Named Assemblies

  the .NET Framework has in place to deal withversioning problems. Two Kinds of Assemblies, Two Kinds of Deployment   weakly named assemblies 、 strongly named assemblies   same:use the same portab...

weixin_30485379的博客 245

Exposing COM Components to the .NET Framework之四Deploy an interop application

Deploying an Interop Application An interop application typically includes a .NET client assembly, one or more interop assemblies representing distinct COM type libraries, and one or more registere...

weixin_30659829的博客 112

私有部署和全局部署

私有部署和全局部署强命名程序集私有部署和全局部署都可以,非强命名程序集则只可以私有部署。非强命名程序集的私有部署(简单拷贝部署)和应用程序部署在同一个目录下的程序集称作私有部署程序集。私有部署给程序员带来方便。安装(复制),移动,卸载(删除)都很简单。简单管理控制(配置)可在应用程序目录下安放一个配置文件,CLR通过解析该文件内容来改变其定位和加载程序集时的策略。如app.exe.config强命

1643

强命名程序集

强命名程序集的缘由:      目前Windows中出现的DLL Hell问题(两个不同的公司可能开发处具有相同名称的程序集,如果将相同名称的程序集放置到同一个目录下,则会出现程序集覆盖现象,最后安装的程序集会覆盖前面的程序集,从而可能导致应用序不能正常运行)。由此看来,仅靠名称来区分程序集是不足够的。CLR采取了强命名程序集的方式来唯一的表示程序集。强命名程序集包含四个标识:名称,版本号,语言文

calm_agan的专栏 3575

如何创建强命名程序集(Strong Name Assembly

如何创建强命名程序集(Strong Name Assembly)-详细版 原文地址:http://www.cnblogs.com/lovablebox/archive/2007/12/05/983599.html (http://xiaoyueweiguang.blog.163.com/blog/static/117267556201082510413610/) 如何部署

gotomic的专栏 1955

关于强命名

由于最近换了一家公司工作,去的第二天就开始做项目,就在自己的项目去引用其他项目时,然后编译,却报“程序集生成失败 -- 引用的程序集没有强名称”的错误。原因:自己的项目是强命名程序集,强命名程序集不能引用普通程序集造成的。这时候,想起来曾经也碰到过这样的问题,所以解决起来也比较简单。今天拿出来写写,主要是想让曾经碰到同样问题的人一个解决问题的思路,仅此而已。若说的不好,还望大家批评...

angtuo7111的博客 285

Visual Studio 2005的SP1补丁问题

今天下了vs2005 sp1来升级我的vs 2005,装完才发现乖乖,补丁打了2个小时。晕了。。。所以从网上找来了整合补丁包的方法从http://blogs.msdn.com/heaths/archive/2006/12/16/slipstreaming-visual-studio-2005-service-pack-1.aspx 看到整合方法如下准备大点的硬盘空间,至少3G以上。

可乐_Blog 5209

Ajax开发框架

 来自CSDN读书频道 >最近在看这本书,再CSDN找到这些内容,贴过来了基于浏览器的应用框架(Application Frameworks)1.Bindows参考网址:http://www.bindows.net/Bindows是一个通过DHTML、JavaScript、 CSS和HTML等技术强劲联合起来的完整的Windows桌面式Web应用程序解决方案。它无需下载安装客户端支持组

可乐_Blog 1763

asp.net 2.0 FileUpload控件的简单使用

 如图:Upload File按钮的事件如下: protected void btnUpload_Click(object sender, EventArgs e)    ...{        bool fileOK = false;        string path = Server.MapPath("~/Temp/");        if (this.uploadFil

可乐_Blog 1437

微软资助的Paint.Net截图

听说Paint.Net 类似PhotoShop,使用后根本不是那么回事,只是界面类似罢了!特点:.net 2.0 ,GDI+ ,64位支持。 

可乐_Blog 1429

VS2005中全角/半角问题

起初在工具--选项--环境--区域设置 把语言设置称"中文简体".然后在vs环境中把光标移到属性需要设置的文本域是就自动转换成全角状态,而打不出中文,甚是郁闷,解决办法,很简单,语言设置改回 "与Microsoft Windows 相同",重新启动vs即可.

可乐_Blog 1313

垃圾回收,析构函数

初始化对象中的书据,运算符new可在调用了对象的构造函数之后,为对象分配内存,构造函数以后还可能获得其他系统资源,比如网络连接,数据库或者文件.一旦程序不再使用对象,对象就必须采取一种严格的方式来返回内存和释放资源.如无法释放这些资源,会导致资源泄漏,有可能耗尽可用的资源,防碍程序的继续执行.在c,c++中,程序员必须显示的管理内存,与此相反,c#中在内部执行内存管理,.NET框架会对内存

可乐_Blog 1302

html中省略部分代码

 overflow: hidden;;text-overflow: ellipsis;white-space: nowrap;

可乐_Blog 1257

安徽大学《信号与系统》历年期末考试试卷(含答案).pdf

安徽大学《信号与系统》历年期末考试试卷(含答案)

经济法学复习题.docx

经济法学复习题.docx

上一篇: .NET中加密和解密的实现方法
下一篇: 试用Windows Live Writer 发表日志
veiny
博客等级 码龄20年 22粉丝 110原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值