如何在ClickOnce应用程序的无签名程序集项目中设置LARGEADRESSAWARE?

时间:2013-10-30 19:27:13

标签: c# deployment clickonce sn.exe

我有一个带有接下来的两个编译后命令的应用程序:

call editbin /LARGEADDRESSAWARE $(TargetPath)
call editbin /LARGEADDRESSAWARE $(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)\$(TargetFileName)

并且工作正常。

但是当我发布到服务器时,因为ClickOne应用程序没有错误,但是当我尝试在客户端安装时,文件的哈希值与清单中计算的值不同。

我尝试使用下一个命令:

sn -Ra $(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)\$(TargetFileName) PublicPrivateKeyFile.snk

但不起作用,它会显示下一条消息:

  

app.exe不代表任何强名称的程序集。

我想这是因为我的所有项目都具有false值的“签署程序集”选项。在使用LARGEADDRESSAWARE之前,ClickOnce应用程序运行良好。

必须为所有项目设置“签署程序集”选项的值为true,或者是否有任何方法可以为此选项使用带有false值的LARGEADDRESSAWARE?

编辑:

Mark Sowul解决方案正常: 我还在AfterBuild中添加了下一行,以检查AfterCompile是否正常工作

call "$(VS110COMNTOOLS)vsvars32.bat"
dumpbin /headers "$(TargetPath)" > "$(TargetPath).info"
findstr "(>2GB)" "$(TargetPath).info"
set BUID_ERRORLEVEL=%ERRORLEVEL%
del "$(TargetPath).info"
if [%BUID_ERRORLEVEL%]==[0] echo EXE program updated to use more than 2GB
if [%BUID_ERRORLEVEL%]==[1] echo ERROR: EXE PROGRAM WAS NOT UPDATED TO USE MORE THAN 2GB
set ERRORLEVEL=%BUID_ERRORLEVEL%

1 个答案:

答案 0 :(得分:5)

Post Build事件在游戏中为时已晚。您已经在某种程度上发现了这一点,因为我意识到您需要在 obj 中更改文件。

但是,Post Build在清单生成之后发生。所以编辑obj文件为时已晚。更好的做法是在AfterCompile构建目标中。

你必须编辑csproj;在您已经看到的行之后添加:

<!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
    **<Target Name="AfterCompile">
        <Exec Command="
call &quot;$(VS110COMNTOOLS)\vsvars32.bat&quot;
editbin /largeaddressaware &quot;$(IntermediateOutputPath)$(TargetFileName)&quot;
" />
    </Target>**