从程序集中删除强签名

时间:2011-08-09 09:12:22

标签: c# .net-4.0

我在构建一些项目时遇到了麻烦。 请考虑这种情况:

  1. 我有2个项目。例如A和B.
  2. 有从A到B的引用
  3. B的项目是强烈签署的(我不希望它出于某些原因签名。所以我决定删除它的“签署大会”的复选框)
  4. 有一行代码 A项目中的AssemblyInfo.cs文件说:

    [assembly: InternalsVisibleTo("B,publicKey=0024......")]
    

    我把它改为:

    [assembly: InternalsVisibleTo("B")]

    现在当我编译其中一个 这些项目出现了错误,并说:

  5.   

    朋友汇编参考'B'无效。强名称签名程序集必须在其InternalsVisibleTo声明中指定公钥。

    我的问题在这里:编译器如何知道有一天它是签名的程序集?如何从B的装配中完全删除强烈签名并最终正确构建它们?

    编辑: 顺便说说 请注意,两个主题都没有强烈签名!因为我从那些项目的属性中删除了那些“签署程序集”复选框


    当我将程序集的名称更改为某个错误的名称,如“bla_bla_bla”甚至不存在时,错误是相同的!
    [assembly: InternalsVisibleTo("bla_bla_bla")] 我认为这个理论是真的: 实际上B Project没有编译,如果找不到匹配的编译项目名称(构建项目A时),编译器猜测B项目是用开发人员没有提供的公钥强烈签名的!最后它会提示这种奇怪的错误!
    由于B的原因引用了A,当我编译B项目时,它会首先编译它的引用(A项目),然后编译器会再次提示我该错误(就像我编写项目A时一样)
    但要么它不是真的,要么我的项目A有些问题。因为我从头开始两个新的简单项目,每件事情都没有错误(即使我改变了[assembly:...]声明到无效的程序集名称)我完全崩溃了

6 个答案:

答案 0 :(得分:6)

我有同样的问题,并删除以下行为我修复了它:

  

[assembly:AssemblyDelaySign(false)]
[装配:   AssemblyKeyName( “”)]

答案 1 :(得分:4)

哦,天啊!我必须删除这行代码:
[assembly: AssemblyKeyName("")]
以便项目完全忘记签署项目并继续它的轻松生活
如您所知,目的地大会是否已签署,因此必须签署参考大会。事实上,这行代码提醒编译器该项目已签名。所以...目标组件也应签名。因此编译器抱怨没有“,publicKey = ...”令牌的朋友集会。

答案 2 :(得分:3)

编译器不知道B以前是强烈命名的。

然而,它确实知道 A 的名字很强。出于安全原因,您只能将强名称程序集的内部暴露给另一个具有强名称的程序集。

答案 3 :(得分:2)

问题似乎问题是A已签名 - 并且您不能让“朋友”从签名的程序集访问无符号程序集

来自the documentation

  

当前程序集和好友程序集必须是未签名的,或者两者都必须使用强名称签名。

我不完全确定它是正确的 - 我希望无符号程序集能够访问已签名的程序集,但这与您当前的情况无关:)

编辑:更新后,我怀疑最简单的方法就是清理解决方案然后重建。

答案 4 :(得分:2)

如果你的程序集都没有签名而且你收到错误,并且你在AssemblyInfo文件中有前面提到的行,那么它们可能就是罪魁祸首。

但正如JoeGeeky所提到的那样,你必须从AssemblyInfo文件中删除这两行,以便编译器不再认为它是签名的程序集:

// both/either cause compiler to think assembly is signed
[assembly: AssemblyKeyFile("")]
[assembly: AssemblyKeyName("")]

这个导致同样的问题(注意true):

// also causes compiler to think assembly is signed
[assembly: AssemblyDelaySign(true)]

但是,如果它设置为false,那么不会触发错误(但是如果你在那里也可以删除它)。

// does not cause compiler to think assembly is signed
[assembly: AssemblyDelaySign(false)]

答案 5 :(得分:0)

[assembly: AssemblyDelaySign(false)]

//[assembly: AssemblyKeyFile("")]
//[assembly: AssemblyKeyName("")] 

评论2行解决了我的问题