接受的答案在过去可能有效,但/dest
现在使用那个未记录的参数失败了:无法修改“grape_setup.exe”。该文件可能是只读的或锁定的。
幸运的是,/dest
当我在 VS 2017 和现在在 VS 2019 中尝试时没有必要,因此可以简单地忽略该选项。
网址设置步骤:
制作可执行文件的副本,因为下一个命令会更改文件:
COPY setup.exe grape_setup.exe
像这样替换 URL:
grape_setup.exe -url="http://foo.bar/MyApp.application?flavor=grape#"
这会grape_setup.exe
发生变化,以便后续运行启动 ClickOnce 应用程序,就好像它是从指定的 URL 打开的一样。
但是等等,最后那是什么#
?
出于某种原因,我还没有弄清楚, using给了我一个可执行文件,它在 URL 的末尾-url
有一个额外的。/MyApp.application
用于分隔此字符串,因此#
它不会被视为最后一个 URL 参数值的一部分。Using#
将其放在片段标识符中,但替代方法是使用&junk=
or&_=
或 just &
。
退出可执行文件
使用-url
修改可执行文件并删除任何 Authenticode 签名。
不幸的是,它以一种signtool.exe
在尝试辞职时中断的方式将其删除:
SignTool Error: SignedCode::Sign returned error: 0x800700C1
%1 is not a valid Win32 application.
这篇博客文章以及一个名为的工具delcert
揭示了为什么会发生这种情况。
这是输出delcert
:
ImageRemoveCertificate failed with error 0x00000057
This happens when there's a listing in IMAGE_DIRECTORY_SECURITY
in the PE's header, but the actual Authenticode signature has been stripped.
Let's fix that ...
Setting both fields to zero ...
Succeeded.
这表明-url
以非干净的方式删除签名,并且delcert
可以为我们解决这个问题。
鉴于此问题,似乎有三个选项可用于获取带有嵌入式 URL 参数的签名可执行文件:
- 在发布之前取消选中“签署 ClickOnce 清单”,发布,然后用于
-url
设置 URL。最后signtool.exe
用来签名。
- 像往常一样发布,
-url
用于设置 URL。跟进delcert
以清理损坏的签名。最后signtool.exe
用来签名。
- 照常发布。然后使用
delcert
删除签名。-url
用来设置网址,最后用signtool.exe
.
这三种方法都可能创建相同的可执行文件。第一个需要更改为.csproj
. 第二个和第三个依赖第三方软件delcert
。
这是一个实际的例子:
将可执行文件复制为grape_setup.exe
. (在第一个例子中描述)
删除 Authenticode 签名:
delcert.exe grape_setup.exe
替换 URL 以设置我们的参数。(在第一个例子中描述)
退出新创建的可执行文件:
signtool.exe sign /sha1 XYZ /t "http://..." grape_setup.exe
的值/sha1
在<ManifestCertificateThumbprint>
项目.csproj
文件中。
/t
is<ManifestTimestampUrl>
但/t
如果不需要时间戳,则可以省略该值。
让构建过程留下一个未签名的引导程序
我找到了另一种获得未签名的方法,setup.exe
这减轻了我必须使用delcert
.
通过将此添加到我的文件中,构建过程会在as.csproj
下留下未签名的副本。bin\Release\app.publish\
unsigned_setup.exe
<Target Name="UnsignedBootstrapper" AfterTargets="_DeploymentGenerateBootstrapper" BeforeTargets="_DeploymentSignClickOnceDeployment">
<Copy SourceFiles="$(PublishDir)\setup.exe" DestinationFiles="$(PublishDir)\unsigned_setup.exe" />
</Target>
_DeploymentGenerateBootstrapper
目标生成引导程序并_DeploymentSignClickOnceDeployment
对其进行签名。上述目标在两者之间运行以制作可执行文件的副本。
这在 VS 2019 中有效,但目标名称在其他版本中可能有所不同。Options
在> Project and Solutions
>下将详细程度设置为“诊断”后,我通过查看构建输出发现了它们Build and Run
。