gpt4 book ai didi

c# - 如何通过安全地签署公共(public) token key 来使 InternalsVisibleTo 属性起作用?

转载 作者:太空狗 更新时间:2023-10-29 17:52:30 27 4
gpt4 key购买 nike

我试图通过使用以下方式向我的单元测试项目公开一些内部结构:

[assembly: InternalsVisibleTo("MyTest")]

但是我得到了错误:

Error 1 Friend assembly reference MyTest' is invalid. Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations. .../MyClass.cs...

当我手动分配 PublicTokenKey 时:

[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")]

解决方案构建没有任何错误。

  1. 为什么我需要包含公钥 token ?
  2. 我不确定包含公钥 token 是否会破坏生产环境。

那么,将公钥分配给我的测试项目的最佳和最安全的方法是什么?

最佳答案

令我惊讶的是 PublicKeyToken 甚至可以工作 - 在我的机器上它强制我使用 PublicKey

  1. 您需要公钥 token 的原因是可以将具有强名称的程序集放入具有高信任度的 GAC 中。如果任何名为“MyTest”的程序集(可能不受信任 - 例如浏览器中的控件)可以调用 GACed 程序集的内部,这将是一个安全漏洞;它需要公钥来防止此类黑客攻击。

  2. 这不应该破坏生产中的任何东西 - 即使找不到程序集。此属性在编译时而非运行时使用。

什么方法最安全?

如果您真的担心它会破坏生产代码,请在发布构建期间删除该属性:

#if (DEBUG || TEST)
[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")]
#endif

如果您有几个项目需要公钥 token (并且您有一个 key 对,您应该这样做),您还可以定义一个文件,例如 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

关于c# - 如何通过安全地签署公共(public) token key 来使 InternalsVisibleTo 属性起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7191373/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com