正在从程序集中删除强签名

本文关键字:删除 集中 程序集 程序 | 更新日期: 2023-09-27 18:04:48

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

  1. 我有两个项目。例如A和B
  2. 有一个从a到B的参考
  3. B的项目被强烈签名(由于某些原因,我不希望它被签名。所以我决定删除它的"签名程序集"复选框(
  4. 里面有一行代码A项目中的AssemblyInfo.cs文件显示:

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

    我把它改成:

    [assembly: InternalsVisibleTo("B")]

    现在,当我编译在这些项目中,出现了一个错误,上面写着:

友元程序集引用"B"无效。强名称签名程序集必须在其InternalsVisibleTo声明中指定公钥。

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

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


当我把程序集的名称改成一些错误的名称,比如"blablabla",但它根本不存在时,错误是一样的!
[assembly: InternalsVisibleTo("bla_bla_bla")]
我认为这个理论是正确的:
事实上,B项目并没有编译,如果它没有找到匹配的编译项目名称(在构建项目A时(,编译器猜测B项目是用开发者没有提供的公钥强签名的!最后它会提示这样一个奇怪的错误!
由于B引用了a,当我编译B项目时,它将首先编译它的引用(a项目(,编译器将再次提示我该错误(与我编译项目a时相同(
但要么这不是真的,要么我的项目A出了问题。因为我从头开始了两个新的简单项目,每件事都很顺利,没有任何错误(即使我将[assembly:…]语句更改为无效的程序集名称(,我完全崩溃了

正在从程序集中删除强签名

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

[程序集:AssemblyDelaySign(false(]
[程序集AssemblyKeyName("(]

天哪!我必须删除这行代码:
[assembly: AssemblyKeyName("")]
让项目A完全忘记签署项目,继续轻松的生活
如您所知,如果目标程序集已签名,则引用的程序集也必须签名。事实上,这行代码提醒编译器这个项目已经签名。所以…目标程序集也应该签名。因此编译器抱怨友元程序集没有",publicKey=…"标记。

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

然而,它确实知道A是强命名的。出于安全原因,只能将强名称程序集的内部公开给另一个强名称程序集中。

听起来问题是A是签名的,并且您不能向"朋友"授予从签名程序集到未签名程序集的访问权限。

来自文件:

当前程序集和友元程序集都必须未签名,或者都必须用强名称签名。

我不完全确定它是否正确——我希望未签名的程序集能够访问已签名的程序集中,但这与您当前的情况无关:(

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

如果您的两个程序集都没有签名,并且您得到了错误,并且您的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)]
[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]
//[assembly: AssemblyKeyName("")] 

评论2行为我解决了问题