网上下了一份代码,很大很大,代码里面有snk文件,应该叫私钥文件吧,同时还有个公钥的序列号,这个序列号是16位的并且我是知道的->a8ea63221fa3c5671 
我曾试着去掉"为程序集签名"(步骤是->右键项目->属性->签名->为程序集签名..),默认选中的,我将其勾选掉,然后编译,就会报类似如下的错->—————————————————————————————————————————————————————
错误 1 已授予对“XXX.WinControls, PublicKey=00240000e”的友元访问,但输出程序集的名称为“XXX.WinControls, Version=2011.3.11.1116, Culture=neutral, PublicKeyToken=null”。请尝试添加对“XXX.WinControls, PublicKey=002400000480000094000000060200”的引用,或者更改输出程序集的名称以使其匹配。 e:\AAA_WinForms_2010_12_11_1234_source\bin\Debug\XXXCommon.dll XXX.WinControls
—————————————————————————————————————————————————————
PS:报的错误信息很长,我截掉了看上去比较多余的信息,比如publicKey的值其实很长很长...如果我将snk文件删除的话,重新编译也会抱类似上面的错。还有一种情况,有的dll勾掉强名称之后重新编译是可以通过的..但是去编译另外一些类库时,由于那些类库用到了之前勾掉强名称的dill,所以提示报错->目标dll不是强名称....
PS:真想不明白,源代码都公开了,还要加这么一层签名干啥.....程序集签名到底是干什么用的?因为我snk,所以我还是能编译通过的,但是我想去掉snk却不行?不咬人各应人...我的目标很简单,“为程序集签名”勾选掉之后,依然可以编译通过!!!!!!!!

解决方案 »

  1.   

    查查你有没有这样一句话,删掉
    [assembly: AssemblyKeyFile("..\\xxxxxxx.snk")]
      

  2.   

    没有  倒是有一大堆下面这玩意[assembly: InternalsVisibleToAttribute("XXXX.UI, PublicKey=0024000004800000940000000602004000001000100a1d41de45059e3267320fb19c95bb256855a6ad4Y78324Y723478293478923479bc465cc495301cf792ab97482ebc9d32bd5be4b83de352160d05ed1be61b21ee3c602d7c507fdda4bd2d25d830660ba1300c9de")]
    //[assembly: InternalsVisibleToAttribute("XXXX.UI.Desing, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a1823742937423874892318f82d72dc0e2f407fa60bf0b04797d423db31b4e5a4a99c53908c7f9428eb9dc9a3d20533fe88893a5541de45059e32673d4Y78324Y72347829347892347956855a6a7019e2ab97d4Y78324Y723478293478923479160d05ed1be61b21ee3c602d7c507fdda4bd2d25d830660ba1300c9de")]
    [assembly: InternalsVisibleToAttribute("XXXXX.Design, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a1d418f82d72dc0e2f407fa60bf0b04797d423db31b4e5a4a99c53908c7f9428eb9dc9a3d20533fe88893a5541de45059e3267320fb19c95bb256855a6a7019eae0538e8af2682d78fc33217dbc465cc495301cf792ab97482ebc9d32bd5be4b83de352160d05ed1be61b21ee3c602d7c507fdda4bd2d25d830660ba1300c9de")]
    [assembly: InternalsVisibleToAttribute("XXXX.GridView, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a1d418f82d7d4Y78324Y7234782934789234798c7f9428eb9dc9a3d20533fe88893a5541de45059e3267320fb19c95bb256855a6a7019eae0538e8af2682d78fc33217dbc465cc4affff2213123123123de352160d05ed1be61b21ee3c602d7c507fdda4bd2d25d830660ba1300c9de")]
      

  3.   

    把 [assembly: InternalsVisibleToAttribute 这些都去掉.
    右击项目-属性-代码分析,选择 Microsoft所有规则 
    再编译看是哪里出错而强名称与代码分析是很有作用的,并不恶心,是因为你不了解,不是三言两语就能说明白的,想了解可查相关资料.
      

  4.   

    不过可能会导致 Internal 成员无法访问而编译出错.
      

  5.   

    snk文件在.net里面被用作存放密钥或密钥对的存储文件,生成密钥对snk文件可以用.net中的sn.exe命令,如“sn -k keyPair.snk”。 snk本身只是用来存放非对称密钥的,但在各个需要用到加密、签名的地方都可以使用: 
    1)用snk文件生成强命名程序集,这样一个assembly才可以被赋予full-trust属性,也可以被添加到GAC中。在VS.NET中生成strong-named assembly,只需要在AssemblyInfo.cs里面添加一下代码并编译即可: 
    [assembly: AssemblyDelaySign(false)] 
    [assembly: AssemblyKeyFile("..\\..\\keyPair.snk")] 
    [assembly: AssemblyKeyName("")] 强命名程序集的缘由: 目前Windows中出现的DLL Hell问题(两个不同的公司可能开发处具有相同名称的程序集,如果将相同名称的程序集放置到同一个目录下,则会出现程序集覆盖现象,最后安装的程序集会覆盖前面的程序集,从而可能导致应用序不能正常运行)。由此看来,仅靠名称来区分程序集是不足够的。CLR采取了强命名程序集的方式来唯一的表示程序集。强命名程序集包含四个标识:名称,版本号,语言文化标识和一个共有/私有密钥对。两种程序集/两种部署方式:.Net支持两种程序集:弱命名程序集和强命名程序集(注:.Net框架中没有弱命名程序集,只是为了和强命名程序集相对应而已)。弱命名程序集和强命名程序集在结构上是相同的。他们都采用PE文件格式,包含PE表头,CLR表头,元数据和清单表。区别在于:强命名程序集拥有一个发布者的公钥/私钥签名对,他们用于唯一的标识程序集的发布者。通过公钥/私钥对,我们可以对程序集进行唯一的标识,安全策略和版本策略。