C# 从程序集中删除强签名
我在建造一些项目时遇到困难。 请考虑这种情况:C# 从程序集中删除强签名,c#,.net-4.0,C#,.net 4.0,我在建造一些项目时遇到困难。 请考虑这种情况: 我有两个项目。例如A和B 有一个从a到B的参考 B的项目被强烈签署(出于某些原因,我不想让它被签署。所以我决定删除它的“签署程序集”复选框) 里面有一行代码 项目中的AssemblyInfo.cs文件显示: [assembly: InternalsVisibleTo("B,publicKey=0024......")] 我把它改成: [组件:内部可视(“B”)] 现在当我编译一个 在这些项目中,出现了一个错误,并表示: 好友程序集引用“B”无效
[assembly: InternalsVisibleTo("B,publicKey=0024......")]
我把它改成:
[组件:内部可视(“B”)]
现在当我编译一个
在这些项目中,出现了一个错误,并表示:请注意,这两个主题都不是强签名!因为我从这些项目的属性中删除了这两个“为程序集签名”复选框
当我将程序集的名称更改为一些错误的名称,例如“bla___________________________________!
[组装:内部可视(“bla_bla_bla”)]
我认为这个理论是正确的:
事实上,B项目没有编译,如果它没有找到匹配的编译项目名称(在构建项目A时),编译器会猜测B项目是使用开发人员没有提供的公钥进行强签名的!最后它会提示这样奇怪的错误!
由于B引用了a,当我编译B项目时,它会先编译它的引用(a项目),然后编译器会再次提示我该错误(与我编译项目a时相同)
但要么它不是真的,要么我的项目A出了问题。因为我从头开始了两个简单的新项目,而且一切都很顺利,没有错误(即使我将[assembly:…]语句更改为无效的程序集名称),我完全崩溃了。听起来问题好像是
A
被签名了,而你不能给出从签名程序集到未签名程序集的“友元”访问
发件人:
当前程序集和好友程序集都必须是未签名的,或者都必须使用强名称签名
我不完全确定它是否正确-我希望未签名的程序集能够访问已签名的程序集,但这与您当前的情况无关:)
编辑:在更新之后,我想最简单的方法就是清理解决方案,然后重新生成。编译器不知道
B
以前是强名称
但是,它确实知道
A
是强名称程序集。出于安全原因,您只能将强名称程序集的内部内容暴露给另一个强名称程序集。哦,天哪!我必须删除这行代码:
[程序集:AssemblyKeyName(“”)]
所以,项目A完全忘记签署项目,继续它的轻松生活
正如您所知,如果目标程序集已签名,则引用的程序集也必须签名。事实上,这一行代码提醒编译器此项目已签名。因此…目标程序集也应签名。因此,编译器抱怨没有“publicKey=”的友元程序集。。。“token.我也遇到了同样的问题,删除以下几行代码后,我就解决了这个问题: [组装:组装延迟符号(假)]
[组装: AssemblyKeyName(“”)
如果两个程序集都没有签名,并且出现了错误,并且AssemblyInfo文件中有前面提到的行,那么它们可能是罪魁祸首 但是正如JoeGeeky提到的,您必须从AssemblyInfo文件中删除这两行,编译器才能不再认为这是一个签名程序集:
//两者/都会导致编译器认为程序集已签名
[程序集:AssemblyKeyFile(“”)]
[程序集:AssemblyKeyName(“”)]
这个问题也会引起同样的问题(请注意true
):
//还使编译器认为程序集已签名
[汇编:AssemblyDelaySign(真)]
但是,如果将其设置为false
,则不会触发错误(但如果您有它,也可以将其删除)
//不会使编译器认为程序集已签名
[汇编:AssemblyDelaySign(false)]
注释2行为我解决了问题构建B,确保它是正确的。然后删除并重新添加从A到B的引用。是的,我应该在没有引用的情况下重建B(这意味着我应该注释项目B的所有类),然后使用已更改的AssemblyInfo.cs文件重建A,然后取消注释项目B和重建B中所有已注释的文件,但仍然存在问题!我评论并成功构建了B,但无法构建A。它仍然没有识别B是构建的(至少我猜是这样),请注意,这两个主题都没有强签名!因为我从这些项目中删除了两个“为程序集签名”复选框properties@Rzassar,你确定吗?编译器似乎认为
A
是强名称,否则它不会出现。是的,我认为是,哈米迪先生。我同意你的看法,真奇怪!但我仔细检查了一下!嗨,乔恩!所有主题都没有强签名。但错误仍然存在persists@Rzassar这对我来说似乎很奇怪。从零开始清理和重建?查看引用真正指的是什么?@Rzassar:查看我的编辑。基本上重新构建整个解决方案,应该可以。对于[assembly:AssemblyKeyFile(“”)]
[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]
//[assembly: AssemblyKeyName("")]