2012-09-20 7 views
6

내에서 ClickOnce 설치가 실패 EXE에 서명 할 때 오류 "파일은 매니페스트에 지정된 것보다 다른 계산 된 해시가 있습니다." 빌드 스크립트에서 해당 줄 다음과 같이오류와 함께

<MSBuild Targets="Publish" 
     Projects="WindowsFormsProject.csproj" 
     ContinueOnError="false" /> 

WindowsFormsProject.csproj는 실행 파일을 서명 빌드 후 단계가 있습니다

signtool sign /a $(ProjectDir)\obj\$(PlatformName)\$(ConfigurationName)\$(TargetFileName) 

내가 빌드에서 볼 때 문제가있다 로그 포스트 - 빌드 이벤트가 실행되기 전에 매니페스트가 생성 된 것을 볼 수 있습니다. 따라서 해시 코드가 일치하지 않는 것은 놀라운 일이 아닙니다. 빌드 로그에서 관련 라인 :

_CopyManifestFiles:

WindowsFormsProject -> ...\WindowsFormsProject.application

...

PostBuildEvent:

Successfully signed: ...\WindowsFormsProject.exe

그래서, 질문은 다음과 같습니다

  1. 매니페스트가 < MSBuild를 > 작업시 발생되기 전에 어셈블리에 서명 할 수있는 방법이 있나요?
  2. 해시 코드가 다시 일치하도록 빌드가 완료된 후에 매니페스트 (및 매니페스트 만)를 다시 생성하는 방법이 있습니까?

또는 문제에 대한 다른 해결책을 생각하면 아이디어를 제공해 주시면 감사하겠습니다.

답변

8

MSBuild 4를 사용하는 경우 AfterTargets 속성을 사용하면 어셈블리를 만든 직후 및 이후 단계를 수행하기 전에 어셈블리에 서명 할 수 있습니다. 빌드 후 단계를 제거하고 다음 블록을 프로젝트에 추가하십시오.

<Target Name="SignOutput" AfterTargets ="CoreCompile"> 
    <PropertyGroup> 
    <TimestampServerUrl>http://timestamp.verisign.com/scripts/timstamp.dll</TimestampServerUrl> 
    <ApplicationDescription>Foo bar</ApplicationDescription> 
    <SigningCertificateCriteria>/sha1 578a9486f10ed1118f2b5f428afb842e3f374793</SigningCertificateCriteria> 
    </PropertyGroup> 
    <ItemGroup> 
    <SignableFiles Include="$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)\$(TargetName)$(TargetExt)" /> 
    </ItemGroup> 
    <GetFrameworkSdkPath> 
      <Output 
       TaskParameter="Path" 
       PropertyName="SdkPath" /> 
    </GetFrameworkSdkPath> 
    <Exec Command="&quot;$(SdkPath)bin\signtool&quot; sign $(SigningCertificateCriteria) /d &quot;$(ApplicationDescription)&quot; /t &quot;$(TimestampServerUrl)&quot; &quot;%(SignableFiles.Identity)&quot;" /> 
</Target> 
+0

누구나 똑같은 실수를 저지른 경우를 생각하면 ... 나는이 대답을 '대상'으로 '포스트 빌드'로 해석했습니다. 이것은 잘못되었습니다. '목표'는 프로젝트 수준이어야합니다. –

3

답은 Dmitriy에게 돌아갑니다. 그러나 나는 그것이 나를 위해 일하게하기 위해 드미트리의 대답에 약간의 변화를 주어야했다. 특히 :

  • 나는 "대상"
  • 나는 윈도우 8.1을 사용하고 내가 PFX 파일을 사용하고있는 signtool.exe 경로
  • 을 변경했다 및 암호를 지정했다 있어요에 대한 종료 태그를 추가
  • 나는 그가 "my_signing_file.pfx", "mypassword", "myexe.exe"의 값을 수정하고 당신을 위해이 일을하기 바랍니다

를 제공하는 정보의 전부를 추가 할 필요가 없습니다 않았다

<Target Name="SignOutput" AfterTargets="CoreCompile"> 
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)my_signing_file.pfx&quot; /p mypassword &quot;$(ProjectDir)obj\$(ConfigurationName)\myexe.exe&quot;" /> 
</Target> 
+0

이 파일에는 어떤 파일이 들어 있습니까? –

+1

프로젝트 파일 (* .csproj) – BlueSky

1

당신은으로 VisualStudio에서 어셈블리와의 ClickOnce 매니페스트의 서명 프로세스를 구성 할 수 있습니다

  1. 오른쪽 프로젝트> 속성> 서명을 클릭합니다.
  2. "ClickOnce Manifest 서명"을 선택하고 사용할 인증서를 선택하십시오.
  3. "어셈블리 서명"을 선택하고 사용할 인증서를 선택하십시오.
  4. 모든 변경 내용을 저장하고 다시 게시하십시오.

이러한 설정은 모두 MsBuild를 사용하여 빌드 할 때 유효합니다.

참고 : 필요하면 해당 화면에서 자체 서명 된 인증서를 생성 할 수 있습니다.

참고 2 : "응용 프로그램 매니페스트"및 "배포 매니페스트"라는 두 개의 매니페스트가 모두 동일한 인증서로 서명되어야한다는 것을 기억하십시오.

빌드 후 언제든지 매니페스트에 다시 서명해야하는 경우 Mage.exe을 사용할 수 있습니다.

관련 문제