这是我们迄今为止发现的。当然,这不是“最佳实践”,但它是一个开始:
签署需要完全信任的 XBAP 项目。
一旦我弄清楚如何解决CI 服务器作为服务运行的问题,PFX 就可以正常工作。
将 XBAP 项目发布到 ASP.NET Web 应用程序中。
2.1 这应该在“发布”配置构建中自动化吗?
2.2 发布的输出是否应该进入 Bin 目录?
2.3 如果可能,我们是否应该避免使用 .deploy 文件扩展名并重用现有程序集?
复制到 Bin 导致 IIS7 中的 RequestFilteringModule 出现问题,所以我们没有使用它。
在 AfterBuild 目标中,我们将输出复制到 ASP.NET Web 应用程序的目录中,而不是发布,Subversion 会忽略该目录,但 Web 部署或 wix 项目不会。因此,我们复制我们需要的内容(dll、exe、manifest、xbap),然后使用一些 MSBuild 魔术重命名为 .deploy 扩展名,因为某些客户端可能会阻止 .exe 或 .dll 下载:
<Target Name="AfterBuild">
<CallTarget Targets="CopyOutputToDeployWebDir" />
</Target>
<Target Name="CopyOutputToDeployWebDir">
<CreateProperty Value="..\Path\To\Application\Dir">
<Output TaskParameter="Value" PropertyName="DeployWebDir" />
</CreateProperty>
<RemoveDir Directories="$(DeployWebDir)" />
<MakeDir Directories="$(DeployWebDir)" />
<ItemGroup>
<DeployWebFiles Include="$(OutputPath)*.dll;$(OutputPath)*.exe;$(OutputPath)*.manifest;$(OutputPath)*.xbap" />
</ItemGroup>
<Copy SourceFiles="@(DeployWebFiles)" DestinationFolder="$(DeployWebDir)" />
<ItemGroup>
<RenameFiles Include="$(DeployWebDir)*.dll;$(DeployWebDir)*.exe" />
</ItemGroup>
<Move SourceFiles="@(RenameFiles)" DestinationFiles="%(RenameFiles.FullPath).deploy" />
</Target>
部署需要完全信任才能从 ASP.NET Web 应用程序使用的 XBAP。
目前看起来我们需要在受信任的根证书存储和受信任的发布者证书存储中安装签名密钥。
版本控制 XBAP 项目。
我们想要与我们的 ASP.NET Web 应用程序版本相同的 XBAP 应用程序版本(在我们的例子中,AssemblyFileVersion 属性),所以我们结束了绕过正常的 ApplicationVersion 属性方法,从我们共享的 AssemblyInfo 文件中覆盖它,该文件被所有程序集使用产品:
<!-- Note that this value is overridden in BeforeBuild target -->
<ApplicationVersion>0.0.0.0</ApplicationVersion>
<!-- ... -->
<Target Name="BeforeBuild">
<CallTarget Targets="SetApplicationVersion" />
</Target>
<!-- Always set application version to product version -->
<Target Name="SetApplicationVersion">
<UpdateVersion Attribute="AssemblyFileVersion" AssemblyInfo="..\ProductAssemblyInfo.cs">
<Output PropertyName="ApplicationVersion" TaskParameter="Version" />
</UpdateVersion>
</Target>
UpdateVersion 是一个自定义 MSBuild 任务,它可以在 AssemblyInfo 文件中读取或写入版本属性值。编写或在网络上找到一些东西来做类似的事情并不难。