2012-09-20 25 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

यदि आप एमएसबील्ड 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

क्रेडिट उनके उत्तर के लिए दिमित्री को जाता है। हालांकि मुझे दिमित्री के जवाब में थोड़ा बदलाव करना पड़ा ताकि वह मेरे लिए काम कर सके। विशेष रूप से:

  • मैं "लक्ष्य"
  • मैं Windows 8.1 का उपयोग कर रहा है, और signtool.exe पथ
  • बदलने के लिए मैं एक PFX फ़ाइल का उपयोग कर रहा था और पासवर्ड निर्दिष्ट करने के लिए किया था के लिए एक अंतिम टैग जोड़ा
  • मैं जानकारी वह प्रदान की

"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. "क्लिकऑन मैनिफेस्ट पर हस्ताक्षर करें" की जांच करें और वह प्रमाणपत्र चुनें जिसका आप उपयोग करना चाहते हैं।
  3. "असेंबली पर हस्ताक्षर करें" की जांच करें और वह प्रमाणपत्र चुनें जिसका आप उपयोग करना चाहते हैं।
  4. सभी परिवर्तनों को सहेजें और फिर से प्रकाशित करें।

जब आप एमएसबिल्ड का उपयोग करते हैं तो ये सभी सेटिंग्स मान्य होंगी।

नोट: यदि आवश्यक हो तो आप उस स्क्रीन से अपना स्वयं-हस्ताक्षरित प्रमाण पत्र जेनरेट कर सकते हैं।

नोट 2: याद रखें कि आपके पास दो विकल्प हैं "एप्लिकेशन मैनिफेस्ट" और "परिनियोजन मैनिफेस्ट" दोनों को एक ही प्रमाणपत्र के साथ हस्ताक्षर किया जाना चाहिए।

यदि आपको निर्माण के बाद किसी भी समय अपने प्रकटताओं को फिर से हस्ताक्षर करने की आवश्यकता है तो आप Mage.exe का उपयोग कर सकते हैं।