正在从程序集中删除强签名
本文关键字:删除 集中 程序集 程序 | 更新日期: 2023-09-27 18:04:48
我在构建一些项目时遇到了麻烦。请考虑这种情况:
- 我有两个项目。例如A和B
- 有一个从a到B的参考
- B的项目被强烈签名(由于某些原因,我不希望它被签名。所以我决定删除它的"签名程序集"复选框(
-
里面有一行代码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行为我解决了问题