在两个 Visual Studio 实例中使用签名依赖项,一个提升/管理员,一个普通

Posted

技术标签:

【中文标题】在两个 Visual Studio 实例中使用签名依赖项,一个提升/管理员,一个普通【英文标题】:Using a signed dependency in two Visual Studio instances, one elevated/administrator, one normal 【发布时间】:2012-11-04 00:56:12 【问题描述】:

我正在运行 Visual Studio 2012 并在单独的解决方案中编写后端 Web 服务和桌面软件。因为桌面软件需要运行提升(“作为管理员”),我需要在提升的 Visual Studio 实例中运行桌面解决方案。两种解决方案都包含一个签名的库项目。

当我在 Visual Studio 实例中打开 Web 服务解决方案而不提升它时,我会收到类似的构建错误

无法导入以下密钥文件:Redacted.pfx。密钥文件可能受密码保护。要更正此问题,请尝试再次导入证书或手动将证书安装到具有以下密钥容器名称的强名称 CSP:VS_KEY_Redacted。

当我尝试修复此 by doing that 时,它失败并显示一条错误消息,指出密钥已存在。

当我尝试排除然后重新包含 PFX 文件时,PFX 文件并没有正确处理,而是使项目属性 → 签名中的“强名称密钥文件”下拉列表为空白。在此之后,Web 服务解决方案构建,但似乎该库没有得到签名,因为在(提升的)桌面解决方案中,构建失败并显示“程序集生成失败 - 引用的程序集'编辑'没有强名称”。

如果我尝试再次从 Web 服务解决方案的下拉列表中选择 PFX 文件(并重新输入密码),我会得到:

导入密钥时出错 试图引用不存在的令牌

从(提升的)桌面解决方案设置 PFX 文件有效,但让我回到第一方。

似乎根据海拔高度,Visual Studio 会在不同的密钥存储中查找解锁 PFX 的任何内容。我是否必须运行两个提升的 Visual Studio 实例才能解决该问题,或者我可以以某种方式告诉它在同一个地方查找吗?

【问题讨论】:

如果包含硬编码的 AssemblyKeyFile 是否有效? 您是否有不想同时以“管理员身份”运行的原因? - 它似乎让我所有的代码签名头痛都消失了,我发现的唯一缺点是您需要为上下文共享(即映射驱动器等)创建一个注册表项才能正常工作。 [仅供参考,可以在此处找到有关注册表项的详细信息:winability.com/…] 我目前以管理员身份运行,并且修复了它。我担心的是,我希望在我的所有项目中以尽可能少的可变性运行,并且因为有些项目运行良好而不需要提升权限,所以尽可能少地运行而不以管理员身份运行。 Microsoft 或多或少地破坏了将 Visual Studio 设置为始终运行提升的能力(我已经接近但它破坏了双击解决方案),但是你不能总是通过运行 Visual Studio 而不提升。 【参考方案1】:

@ccpanda 的评论解决了这个问题。包括一个AssemblyKeyFile 档案使这项工作。例如:

[assembly: AssemblyKeyFile("HerpDerpWarblerManagementStudioProTM.snk")]

总而言之,这两个 Visual Studio 将根据其模式假设不同的事物。解决方案不是让他们假设相同的事情,而是告诉他们该做什么。

(我选择使用.snk 文件,因为如果您不想在每次其他开发人员尝试构建时都重新输入密码,那么您必须这样做。This question has a lot more information。基本上,您必须使用.snk 文件或编译您的构建过程,然后使用sn.exe 调用对文件进行签名,这将不知何故知道为每个人使用.pfx 文件。)

(@ccpanda:如果您将您的评论写为答案(也许您写了,并且 Stack Overflow 认为这是微不足道的),我会将其标记为答案。)

【讨论】:

以上是关于在两个 Visual Studio 实例中使用签名依赖项,一个提升/管理员,一个普通的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Visual Studio 中使用 SHA256 对程序集进行签名时出错

如何在 Visual Studio 中实际搜索所有文件

Visual Studio应用程序中的两个主要方法?

win 7 装visual studio 2015出现问题, 没有验证对象的数字签名

对于使用 WSL2 进行签名的 git 提交,Windows 10 上的 Visual Studio Code 中没有 GPG 密码提示

我可以在 Visual Studio“当命中”断点中像 $FUNCTION(带有完整签名)一样格式化 $CALLER 吗?