我在编译nHibernate时出现以下错误,请问如何解决?对程序集“D:\oss\nHibernate\src\NHibernate\obj\Debug\NHibernate.dll”签名时加密失败 --“读取密钥文件“..\NHibernate.snk”时出错 -- 系统找不到指定的文件。 ”

解决方案 »

  1.   

    NHIBERNATE.DLL这个控件被人家用强名称保护了,你用不了!
      

  2.   

    NHIBERNATE.DLL如果有编译这个类的源码!你可以去掉强名称的保护了!如果没有,估计是用不了这个DLL了!
      

  3.   

    解决方法:
    1. 去掉强名称签名,然后编译.
    2. 用sn产生一个签名,取名为nhibernate.snk, 放到nhibernate指定的位置再编译。
      

  4.   

    编译一下,会有一大堆的错误,其中最后一点是:
    对程序集“G:\NetBookShelf\nhibernate\nhibernate-0.7.0.0\src\NHibernate\obj\Debug\NHibernate.dll”签名时加密失败 --“读取密钥文件“..\NHibernate.snk”时出错 -- 系统找不到指定的文件。 ”
        原因是没有密钥文件,可以使用这样的方法创建一个密钥文件:
       1,找到签名工具sn.exe,默认的路径是:系统盘:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin;(如果没有的话通过搜索sn.exe来查找)
       2,选择桌面上的“我的计算机”图标,右击,属性/高级/环境变量/系统变量/新建/系统变量 ,弹出新建系统变量对话框,如下设置:
        变量名:path 
        变量值:系统盘:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin;
       3,打开命令行,执行
          C:
          sn -k NHibernate.snk
          会在c盘中生成一个NHibernate.snk文件,把他剪贴到\nhibernate-0.7.0.0\src\NHibernate\obj\目录下。
        编译就可以通过了。    或者最直接的方法就是,不要签名了,找到NHibernate-1.1项目的AssemblyInfo.cs文件,注释掉下面一行:
        [assembly: AssemblyKeyFileAttribute("..\\NHibernate.snk")]
        编译就可以通过了。
    下面简单的解释以下strong name:
    (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconStrong-NamedAssemblies.asp)
        加密签名是计算机安全方面的名词,加密分为对称和非对称加密,这里用的是后者,    strong name是进行程序集版本控制和名称保护的,对一个程序集进行签名后就会得到一个strong name。strong name由以下几部分组成程序集的标识(即它的简单文本名称),版本号和区域性信息(如果提供的话),以及公钥和数字签名。strong name可以确保一个程序集名称的唯一性。强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该程序集的所有文件的名称和散列)生成的。
        需要强调的是,是对程序集的加密和签名(包括名称,版本等信息)得到强名称,强名称是唯一的,所以程序集也是唯一的,程序集加密签名成strong name需要使用私钥,这个私钥由keyname和keyfile组成,其中KeyName 是指已经安装在计算机上的加密服务提供程序(CSP)中的密钥。KeyFile 是指包含密钥的文件(其实就是.snk文件)。KeyFile通过sn.exe生成。
      

  5.   

    行之有效的方法:打开源文件将AssemblyInfo.cs文件里的:[assembly: AssemblyKeyFile("")]设成这样,然后重新编译即可.
      

  6.   

    重新生成一个SNK或引用放在其他地方的SNK试试