2009-09-28 9 views
27

मेरे सी # क्लिकऑन एप्लिकेशन में, प्रोजेक्ट ->गुण -> टैब प्रकाशित करें में एक ऑटो-वृद्धिित प्रकाशित संस्करण है। मैं अपने मेनू में उस संस्करण को प्रदर्शित करना चाहता हूं सहायता ->लगभग बॉक्स, लेकिन जो कोड मैं उपयोग कर रहा हूं वह स्पष्ट रूप से असेंबली संस्करण तक पहुंचता है, जो अलग है।प्रकाशित संस्करण को .NET ClickOnce एप्लिकेशन में असेंबली संस्करण में सिंक्रनाइज़ कैसे करें?

विधानसभा संस्करण परियोजना में मैन्युअल रूप से बदला जा सकता है ->गुण ->आवेदन -> विधानसभा सूचना संवाद। तो अब के लिए, मैं प्रकाशित होने से पहले हर बार मैं प्रकाशन संस्करण को असेंबली संस्करण में कॉपी कर रहा हूं, इसलिए मेरा संवाद एप्लिकेशन का वर्तमान संस्करण दिखाता है। ऐसा करने का एक बेहतर तरीका होना चाहिए।

मैं वास्तव में करना चाहता हूं कि एक सटीक, स्वत: अद्यतन, कोड-सुलभ संस्करण संख्या हो।

public string AssemblyVersion 
{ 
    get 
    { 
     return Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
    } 
} 

एक वैकल्पिक कोड है कि प्रकाशित संस्करण तक पहुँचता है खोजने के लिए होगा:

यहाँ कोड मैं विधानसभा संस्करण संख्या तक पहुँचने के लिए उपयोग कर रहा हूँ है।

उत्तर

19

sylvanaar के अंतिम पंक्ति, रास्ते जाने के लिए की तरह लग रहा मेरे अनुभव में; लेकिन चेतावनी के साथ कि यह केवल आवेदन के तैनात संस्करणों के लिए उपलब्ध है।

- Microsoft.VisualBasic.targets instead of Microsoft.CSharp.targets 
- CodeLanguage="VB" instead of CodeLanguage="CS" 
- AssemblyInfo.vb instead of VersionInfo.cs 

, रास्तों में मतभेद:

static internal string GetVersion() 
    { 
     if (ApplicationDeployment.IsNetworkDeployed) 
     { 
      return ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString(); 
     } 

     return "Debug"; 
    } 
+0

बहुत धन्यवाद - यह जाने का सबसे आसान तरीका है, और ऐसा लगता है कि यह एक आकर्षण की तरह काम करता है! –

+3

हालांकि यह आदर्श नहीं है, क्योंकि जब आप एक असेंबली पर राइट-क्लिक करते हैं और गुण देखते हैं, तो प्रदर्शित संस्करण अभी भी असेंबली वर्जन है। –

+0

नोट: * एप्लिकेशन डिप्लॉयमेंट। आईएसनेटवर्क नियोजित * परिणामस्वरूप पहले मौका अपवाद फेंक दिया जाएगा। यह डिबगिंग, आदि के साथ हस्तक्षेप कर सकता है। –

10

मैंने असेंबली संस्करण को अद्यतन करने के लिए मेरी .csproj फ़ाइल को संशोधित किया। मैंने इसके लिए "पब्लिक रिलीज" नामक कॉन्फ़िगरेशन बनाया है, लेकिन ऐसा करने की आवश्यकता नहीं है।

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
    <!-- 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> 
    --> 
    <PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'"> 
    <MSBuildCommunityTasksPath>$(SolutionDir)Tools\MSBuildCommunityTasks</MSBuildCommunityTasksPath> 
    </PropertyGroup> 
    <!-- Required Import to use MSBuild Community Tasks --> 
    <Import Project="$(SolutionDir)Tools\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" Condition="'$(BuildingInsideVisualStudio)' == 'true'" /> 
    <Target Name="BeforeCompile" Condition="'$(BuildingInsideVisualStudio)|$(Configuration)' == 'true|PublicRelease'"> 
    <FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)"> 
     <Output TaskParameter="OutputVersion" PropertyName="AssemblyVersionToUse" /> 
    </FormatVersion> 
    <AssemblyInfo CodeLanguage="CS" OutputFile="$(ProjectDir)Properties\VersionInfo.cs" AssemblyVersion="$(AssemblyVersionToUse)" AssemblyFileVersion="$(AssemblyVersionToUse)" /> 
    </Target> 

प्रकाशित संस्करण हो सकता है:

ApplicationDeployment.CurrentDeployment.CurrentVersion 
2

मैं वीबी साथ प्रयोग के लिए sylvanaar के समाधान संशोधित: डीबगिंग उद्देश्यों के लिए, आप कुछ की तरह चाहते हो सकता है

- $(SolutionDir).build instead of $(SolutionDir)Tools\MSBuildCommunityTasks 
- $(ProjectDir)AssemblyInfo.vb instead of $(ProjectDir)Properties\VersionInfo.cs 

, और शर्तों को हटाने के लिए :

- Condition="'$(BuildingInsideVisualStudio)' == 'true'" 
- Condition="'$(BuildingInsideVisualStudio)|$(Configuration)' == 'true|PublicRelease'" 

मैं भी क्रमश ClickOnce PUBLISHERNAME और ProductName साथ कंपनी और उत्पाद सिंक्रनाइज़ और एक कॉपीराइट आज की तारीख के आधार पर जेनरेट:

- AssemblyCompany="$(PublisherName)" 
- AssemblyProduct="$(ProductName)" 
- AssemblyCopyright="© $([System.DateTime]::Now.ToString(`yyyy`)) $(PublisherName)" 

मैं अपने vbproj फाइल करने के लिए इस जोड़ने समाप्त हो गया। यह MSBuildTasks NuGet पैकेज की आवश्यकता है पहले स्थापित होने के लिए:

<Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" /> 
    <PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'"> 
    <MSBuildCommunityTasksPath>$(SolutionDir).build</MSBuildCommunityTasksPath> 
    </PropertyGroup> 
    <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" Condition="'$(BuildingInsideVisualStudio)' == 'true'" /> 
    <Target Name="BeforeCompile"> 
    <FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)"> 
     <Output TaskParameter="OutputVersion" PropertyName="AssemblyVersionToUse" /> 
    </FormatVersion> 
    <AssemblyInfo CodeLanguage="VB" OutputFile="$(ProjectDir)AssemblyInfo.vb" AssemblyVersion="$(AssemblyVersionToUse)" AssemblyFileVersion="$(AssemblyVersionToUse)" AssemblyCompany="$(PublisherName)" AssemblyProduct="$(ProductName)" AssemblyCopyright="© $([System.DateTime]::Now.ToString(`yyyy`)) $(PublisherName)"/> 
    </Target> 

मैं कितना प्रोजेक्ट फाइल मामलों के भीतर स्थान, लेकिन मैं अपने प्रोजेक्ट फाइल के अंत करने के लिए इस जोड़ा यकीन नहीं है, बस से पहले:

</Project> 
2

मैंने इसे दूसरी तरफ किया, मेरे असेंबली संस्करण 1.0 के लिए वाइल्डकार्ड का उपयोग किया।* - तो दृश्य स्टूडियो/MSBuild स्वचालित रूप से एक संस्करण संख्या उत्पन्न:

// AssemblyInfo.cs  
[assembly: AssemblyVersion("1.0.*")] 

और फिर मैं ClickOnce परियोजना के लिए निम्न AfterCompile लक्ष्य जोड़ा विधानसभा संस्करण के साथ सिंक्रनाइज़ PublishVersion आवंटित करने के लिए:

<Target Name="AfterCompile"> 
    <GetAssemblyIdentity AssemblyFiles="$(IntermediateOutputPath)$(TargetFileName)"> 
     <Output TaskParameter="Assemblies" ItemName="TargetAssemblyIdentity" /> 
    </GetAssemblyIdentity> 
    <PropertyGroup> 
     <PublishVersion>%(TargetAssemblyIdentity.Version)</PublishVersion> 
    </PropertyGroup> 
</Target> 
0

मैं करूंगा सिल्वेनार के जवाब पर विस्तार करना चाहते हैं, क्योंकि कुछ कार्यान्वयन विवरण मेरे लिए स्पष्ट नहीं थे। तो: https://github.com/loresoft/msbuildtasks/releases नोट::

  1. मैन्युअल समुदाय का निर्माण कार्य में पाया स्थापित nuget द्वारा स्थापित मत अगर आप, अपने संकुल को साफ बनाने के रूप में संकुल बहाल करने के लिए एक मौका मिल रहा से पहले असफल हो जायेगी क्योंकि msbuildtasks संदर्भित निर्माण फ़ाइल में एक कार्य के रूप में। मैं अगले .build

  2. बुलाया समाधान फाइल करने के लिए फ़ोल्डर में इन डाल अपनी परियोजनाओं के लिए एक पूरी तरह से खाली फ़ाइल जोड़ें गुण VersionInfo.cs

3 इन पंक्तियों निकालें बुलाया फ़ोल्डर अगर वे AssemblyInfo.cs

में मौजूद
[assembly: AssemblyVersion("1.0.*")] 
[assembly: AssemblyFileVersion("1.0.*")] 

4 अपने csproj फ़ाइल को संशोधित

<!-- Include the build rules for a C# project. --> 
    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 

    <!--INSERT STARTS HERE--> 
    <!--note the use of .build directory--> 
    <PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'"> 
    <MSBuildCommunityTasksPath>$(SolutionDir)\.build\MSBuildCommunityTasks</MSBuildCommunityTasksPath> 
    </PropertyGroup> 
    <!-- Required Import to use MSBuild Community Tasks --> 
    <Import Project="$(SolutionDir)\.build\MSBuild.Community.Tasks.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true'" /> 
    <Target Name="BeforeCompile" Condition="'$(BuildingInsideVisualStudio)|$(Configuration)' == 'true|Release'"> 
    <FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)"> 
     <Output TaskParameter="OutputVersion" PropertyName="AssemblyVersionToUse" /> 
    </FormatVersion> 
    <AssemblyInfo CodeLanguage="CS" OutputFile="$(ProjectDir)Properties\VersionInfo.cs" AssemblyVersion="$(AssemblyVersionToUse)" AssemblyFileVersion="$(AssemblyVersionToUse)" /> 
    </Target> 

5 संस्करण पाठ तक पहुंचने के लिए निम्न की तरह एक विधि का उपयोग करें:

public string Version 
    { 
     Version version = null; 

     if (ApplicationDeployment.IsNetworkDeployed) 
     { 
      version = ApplicationDeployment.CurrentDeployment.CurrentVersion; 
     } 
     else 
     { 
      version = typeof(ThisAddIn).Assembly.GetName().Version; 
     } 

     return version.ToString(); 
    } 
संबंधित मुद्दे