我试图通过使用:
向我的单元测试项目公开一些内部结构[assembly: InternalsVisibleTo("MyTest")]
但我收到错误:
错误1朋友程序集引用MyTest'无效。强名称 签名的程序集必须在其中指定一个公钥 InternalsVisibleTo声明。 ... / MyClass.cs ...
当我手动分配PublicTokenKey时:
[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")]
解决方案构建没有任何错误。
那么,为我的Test项目分配公钥的最佳和最安全的方法是什么?
答案 0 :(得分:7)
我很惊讶PublicKeyToken
甚至有效 - 在我的机器上它迫使我使用PublicKey
您需要公钥令牌的原因是因为可以将具有强名称的程序集放入GAC中 - 这具有很高的信任度。如果任何名为“MyTest”的程序集(可能不受信任 - 例如浏览器中的控件)可能会调用GACed程序集的内部,那将是一个安全漏洞。它想要公钥来防止这种类型的黑客攻击。
这不会破坏生产中的任何东西 - 即使无法找到装配体。此属性在编译时使用,而不是在运行时使用。
最安全的方法是什么?
如果您真的担心它会破坏生产代码,请在发布版本中删除该属性:
#if (DEBUG || TEST)
[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")]
#endif
如果您有一些需要公钥令牌的项目(并且您有一个密钥对,您应该这样做),您还可以定义一个文件,例如AssemblyInfo.global.cs
,并将其作为链接文件添加到所有你的项目:
class KeyTokens
{
public const string Global = ", PublicKeyToken=XxxxxYysakf";
}
这简化了事情(特别是如果你需要使用真的长的PublicKey
):
#if (DEBUG || TEST)
[assembly: InternalsVisibleTo("MyTest" + KeyTokens.Global)]
[assembly: InternalsVisibleTo("HisTest" + KeyTokens.Global)]
[assembly: InternalsVisibleTo("TheirTest" + KeyTokens.Global)]
#endif