日期:2014-05-18  浏览次数:20589 次

100分,求VS2005中如何生成强名称程序集,初学,有许多疑问,请您帮助一下。
如题:求VS2005中如何生成强名称程序集

疑问一:网上的的教程都是说的.cs单个文件成一个单独的Dll程序集,可是asp.net中有许多.cs文件,也不能一个一个的作啊,那得有多少个Dll啊??

疑问二:SN.exe生成的密钥放到哪里,AssemblyKeyFile的路径是从网站根路径来的吗??

疑问三:如果,给客户文件时,必须把密钥一起给了吗(没有密钥,是不是网站就不能运行了?)??

疑问四:公钥和私钥,哪个写到AssemblyKeyFile中??不是不丢了其中的一个,就不能再开发这个项目了呢??

疑问五:是在项目一开始时,就用强名称和公钥,密钥,还是在项目完成了后,再作强名称和公钥,密钥呢??

疑问六:强名称是不是为WEB项目准备的(即,是不是可以用在WEB项目上)??


可能说的很乱,如果您有好的文章也提供一下,谢谢了。

------解决方案--------------------
疑问一:网上的的教程都是说的.cs单个文件成一个单独的Dll程序集,可是asp.net中有许多.cs文件,也不能一个一个的作啊,那得有多少个Dll啊??

答:怎么可能,一个dll对应一个内库文件,是你需要哪些,就加哪些

疑问二:SN.exe生成的密钥放到哪里,AssemblyKeyFile的路径是从网站根路径来的吗??

答:可以设置AssemblyKeyFile


疑问三:如果,给客户文件时,必须把密钥一起给了吗(没有密钥,是不是网站就不能运行了?)??


答:如果你的项目成果做了打包,可以在打包中加入密钥

疑问四:公钥和私钥,哪个写到AssemblyKeyFile中??不是不丢了其中的一个,就不能再开发这个项目了呢??

答:一个公钥对应一个私钥。
密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。
如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。


疑问五:是在项目一开始时,就用强名称和公钥,密钥,还是在项目完成了后,再作强名称和公钥,密钥呢??


答:其实就看你们了,依据你的习惯,但最好在项目开始时加入


疑问六:强名称是不是为WEB项目准备的(即,是不是可以用在WEB项目上)??

答:强名称程序集里面要三样东西:
公钥标识(公钥的散列值的最后八个字节) ,公钥 ,密文
强名称机制最起码起到两个作用:区分程序集 ,避免程序集被恶意更改



------解决方案--------------------
l Name= MSCorLib

l Version=1.0.3300.0

l Culture=neutral

l PublicKeyToken=b77a5c561934e089

如果我们自己编写一个弱名称程序集,那么通常PublicKeyToken这一项就没有。

下面我尝试着说一说强名称的机制。

首先,你通过SN.exe获得一个公钥和一个密钥。

然后,使用公钥对程序集的可执行文件(不包括DOS头、PE头等)进行哈希算法,得到一个文件散列值。

最后,使用密钥对文件散列值进行加密,得到一个密文。

这样,最后的强名称程序集里面要三样东西:

l 公钥标识(公钥的散列值的最后八个字节)

l 公钥

l 密文

使用公钥和程序集的可执行文件(不包括DOS头、PE头等)进行哈希算法可以得到一个文件散列值,使用公钥和密文也可以得到一个文件散列值,如果这两个散列值完全一致,OK,验证通过。

最后,说说公钥标识(公钥的散列值的最后八个字节)的作用:

l 区分程序集,上面提到过它是程序集区分彼此的四大属性之一

l 验证公钥

总的来说,强名称机制最起码起到两个作用:

l 区分程序集

l 避免程序集被恶意更改

------解决方案--------------------
试着回答一下,错了莫怪。


【疑问一:网上的的教程都是说的.cs单个文件成一个单独的Dll程序集,可是asp.net中有许多.cs文件,也不能一个一个的作啊,那得有多少个Dll啊??】
可以把所有的程序生成一个统一的dll文件,有一个visual stuio web deployment project模板
来干这个事情,可以从微软的网站下载到。

【疑问二:SN.exe生成的密钥放到哪里,AssemblyKeyFile的路径是从网站根路径来的吗??】
生成的密钥放到工程文件下就可用了。

【疑问三:如果,给客户文件时,必须把密钥一起给了吗(没有密钥,是不是网站就不能运行了?)??】
不需要把密钥给客户,密钥只用来对程序集进行签名,不影响网站的运行。


【疑问四:公钥和私钥,哪个写到AssemblyKeyFile中??不是不丢了其中的一个,就不能再开发这个项目了呢??】
不知道你所指的AssemblyKeyFile是哪儿的?从签名来说当然是用私钥来签名。


【疑问五:是在项目一开始时,就用强名称和公钥,密钥,还是在项目完成了后,再作强名称和公钥,密钥呢??】
都可以。

【疑问六:强名称是不是为WEB项目准备的(即,是不是可以用在WEB项目上)??】
当然可以用在WEB项目上了。最典型有两种应用:
(1)WEB客户端控件或者程序(例如XBAP)使用强名称,然后通过在IE中设置信任的证书可以
给程序更高的安全级别;
(2)客户端或者服务器端程序(例如SharePoint webpart)如果需要部署到GAC中,则必须
进行签名以生成强名称,否则无法安装到GAC中。



------解决方案--------------------
自己动手做过 VS.NET 2003 ,那时只是为了学习 PKI 技术。

疑问一:网上的的教程都是说的.cs单个文件成一个单独的Dll程序集,可是asp.net中有许多.cs文件,也不能一个一个的作啊,那得有多少个Dll啊??
答:“可以只为一个项目做一个”

疑问二:SN.exe生成的密钥放到哪里,AssemblyKeyFile的路径是从网站根路径来的吗??
答:“可以是绝对路径,相对路径没试过”


疑问三:如果,给客户文件时,必须把密钥一起给了吗(没有密钥,是不是网站就不能运行了?)??
答:“不需要。只要一个生成好的 .snk 文件就行,里面已包含相关的私钥与公钥信息”

疑问四:公钥和私钥,哪个写到AssemblyKeyFile中??不是不丢了其中的一个,就不能再开发这个项目了呢??
答:两者都写进去了。文件丢了,就重新生成一个,重新编译一次即可。


疑问五:是在项目一开始时,就用强名称和公钥,密钥,还是在项目完成了后,再作强名称和公钥,密钥呢??