Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从程序集中删除强签名_C#_.net 4.0 - Fatal编程技术网

C# 从程序集中删除强签名

C# 从程序集中删除强签名,c#,.net-4.0,C#,.net 4.0,我在建造一些项目时遇到困难。 请考虑这种情况: 我有两个项目。例如A和B 有一个从a到B的参考 B的项目被强烈签署(出于某些原因,我不想让它被签署。所以我决定删除它的“签署程序集”复选框) 里面有一行代码 项目中的AssemblyInfo.cs文件显示: [assembly: InternalsVisibleTo("B,publicKey=0024......")] 我把它改成: [组件:内部可视(“B”)] 现在当我编译一个 在这些项目中,出现了一个错误,并表示: 好友程序集引用“B”无效

我在建造一些项目时遇到困难。 请考虑这种情况:

  • 我有两个项目。例如A和B
  • 有一个从a到B的参考
  • B的项目被强烈签署(出于某些原因,我不想让它被签署。所以我决定删除它的“签署程序集”复选框)
  • 里面有一行代码 项目中的AssemblyInfo.cs文件显示:

    [assembly: InternalsVisibleTo("B,publicKey=0024......")]
    
    我把它改成:

    [组件:内部可视(“B”)]

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

  • 好友程序集引用“B”无效。强名称签名的程序集必须在其InternalsVisibleTo声明中指定公钥

    我的问题是:编译器如何知道有一天它是一个已签名的程序集?如何从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("")]