用clickonce延迟标志

时间:2012-05-09 00:54:09

标签: msbuild clickonce pfx delay-sign

我有一个依赖于延迟签名(带.pfx)程序集的ClickOnce应用程序。我目前依赖项目的Publish目标来创建我的ClickOnce部署,并希望尽可能保持这种方式(避免法师)。

我的问题是打包的程序集仍然是延迟签名的,因为在发布运行时我没有机会运行“sn -Rc ...”。有没有办法在构建/重建后挂钩到Publish目标以对程序集进行签名。如果发布没有触发构建,我也可以在发布之前签署程序集。

有什么建议吗?

有些线索我不确定如何追求: - 在.deploy文件中签署程序集 - 重新使用发布目标生成的.manifest和.application文件来创建带有签名程序集的新部署

总结:如何重新使用(使用或不使用mage)发布目标生成的.manifest / .application来创建新部署?相同的文件,有些略有不同。

谢谢, 贝努瓦

2 个答案:

答案 0 :(得分:1)

好奇,使用法师你有什么问题?这就是它的设计目标,并且很容易重新签署您的部署。 Here is an article showing how to do that.

如果您不想使用法师,可以查看模式和实践提供的MMU应用程序,它是here:您可以查看代码;它以编程方式创建部署包。

发布始终进行构建,没有什么可以阻止它(许多人已经尝试过!)。

如果要在创建发布包后向部署中添加文件,请查看this page底部的“选项2”。 IIRC,“自动”是指使用MMU;手动意味着使用Mage或MageUI。

答案 1 :(得分:0)

<块引用>

我的问题是打包的程序集仍然延迟签名,因为在发布运行时我没有机会运行“sn -Rc ...”。有没有办法在构建/重建后挂钩到发布目标以对我的程序集进行签名。

我在这方面已经很晚了,但我最近也遇到了这个问题,并设法将一个任务插入到 MSBuild 中,该任务在构建任务之后直接对程序集(而不是清单)进行了完全签名。所以辞职是在发布之前完成的。

我将引用下面 .targets 文件的相关行:

  <PropertyGroup Label="ProjectInfo">
    <AssemblyExtension Condition="'$(OutputType)' == 'Library'">.dll</AssemblyExtension>
    <AssemblyExtension Condition="'$(OutputType)' == 'WinExe'">.exe</AssemblyExtension>
    <AssemblyExtension Condition="'$(OutputType)' == 'Exe'">.exe</AssemblyExtension>
  </PropertyGroup>

  <PropertyGroup Label="Signing">
    <!-- the build server keeps the private key a secret; the path to the key file also containing 
         the private key is injected via build server environment -->
    <StrongNameKeyFile>$(STRONG_NAME_KEY)</StrongNameKeyFile>
    <IsBuildServer>$(BUILDSRV)</IsBuildServer>
  </PropertyGroup>

  <Target Name="Hook_AfterBuild" AfterTargets="AfterBuild">
  </Target>

  <!-- Fully sign the delay signed assembly on the build server -->
  <Target Name="FullySignAssembly" AfterTargets="Hook_AfterBuild"
          Condition=" '$(IsBuildServer)' == 'true' And '$(DelaySign)' == 'true' And '$(SignAssembly)' == 'true' ">
    <Exec Command="sn.exe -Ra $(OutputPath)$(AssemblyName)$(AssemblyExtension) $(StrongNameKeyFile)"/>
  </Target>