2010-05-12 26 views
29

के लिए असेंबली संस्करण नहीं मिल रहा है मैं this question में वर्णित स्वचालित निर्माण संस्करण का उपयोग कर रहा हूं (चयनित उत्तर नहीं, लेकिन उत्तर जो [assembly: AssemblyVersion("1.0.*")] तकनीक का उपयोग करता है)। मैं यह मेरी Site.Master फ़ाइल के पाद लेख में MVC 2 में ऐसा करने से इस प्रकार है के लिए मेरे कोड कर रहा हूँ:पाद लेख

<div id="footer"> 
    <a href="emailto:[email protected]">[email protected]</a> - Copyright © 2005-<%= DateTime.Today.Year.ToString() %>, foo LLC. All Rights Reserved. 
    - Version: <%= Assembly.GetEntryAssembly().GetName().Version.ToString() %> 
</div> 

अपवाद मैं मिलता है क्योंकि GetEntryAssembly() एक Object reference not set to an instance of an object रिटर्न NULL है। मेरे अन्य विकल्प या तो काम नहीं करते हैं। GetCallingAssembly() हमेशा "4.0.0.0" और GetExecutingAssembly() लौटाता है "हमेशा 0.0.0.0" देता है। जब मैं अपने डीएलएल को देखता हूं, तो सब कुछ वैसा ही होता है जैसा मैं उम्मीद करता हूं। लेकिन मैं यह नहीं समझ सकता कि इसे मेरे पाद लेख में प्रदर्शित करने के लिए कैसे पहुंचाया जाए !!

+0

'विधानसभा.GetAssembl y (this.GetType())। GetName()। Version.ToString() '" 0.0.0.0 " – Jaxidian

+0

GetEntryAssembly() भी वापस लौटा सकता है जब असेंबली अप्रबंधित कोड http://msdn.microsoft से कॉल किया जाता है .com/en-us/library/system.reflection.assembly.getentryassembly.aspx – GenEric35

+0

और w3wp.exe वास्तव में अप्रबंधित है, मॉड्यूल 'w3wp.exe' में कोई CLI शीर्षलेख नहीं है – GenEric35

उत्तर

56

क्योंकि Assembly.GetEntryAssembly() अशक्त लौट रहा है यही कारण है कि: वहाँ एक ASP.NET साइट में कोई "प्रविष्टि" विधानसभा है (क्योंकि .NET फ़्रेमवर्क w3wp.exe प्रक्रिया में होस्ट किया गया है)। Assembly.GetEntryAssembly() है कि आप से

कारण Assembly.GetAssembly(this.GetType()) संस्करण के साथ "0.0.0.0" एक विधानसभा लौटा रहा है (आमतौर पर एक कंसोल या विंडोज़ अनुप्रयोग में) का शुभारंभ किया .exe विधानसभा प्राप्त करने के लिए प्रयोग किया जाता है क्योंकि ASP.NET अपने Site.Master संकलित अपने "एएसपी.नेट अस्थायी फ़ाइलें" फ़ोल्डर के तहत अस्थायी असेंबली में फ़ाइल करें। this "जेनरेट" कक्षा का संदर्भ है।

Assembly.GetExecutingAssembly()मूल रूप सेAssembly.GetAssembly(this.GetType()) रूप में ही है (सिवाय यह भी काम करता है जब वहाँ है कि आप पता है कोई "इस" (जैसे स्थिर तरीकों में)।

सबसे अच्छा तरीका उपयोग स्पष्ट रूप से एक प्रकार का उपयोग किया जाएगा विधानसभा आप के बाद कर रहे हैं में मौजूद है एक उदाहरण के रूप में, मुझे लगता है अपने "Site.Master" एक कोड-पीछे फ़ाइल है कि विधानसभा में संकलित किया गया है है, तो आप इसके बजाय उसका उपयोग कर सकते हैं:।।

Assembly.GetAssembly(typeof(Site)).GetName().Version.ToString() 

(यह मानते हुए कक्षा का नामहै)

+10

यह काम करता है! '<% = असेंबली। गेटअस्प्लर (टाइपफॉफ़ (होमकंट्रोलर))। GetName()। संस्करण। टॉस्ट्रिंग()%>' – Jaxidian

+0

दिलचस्प है, मैंने एक HTMLHelper एक्सटेंशन बनाकर थोड़ा परीक्षण किया है जिसमें विधानसभा है। GetExecutingAssembly() इसमें कॉल करें और मैं इसे अपनी साइट से कॉल करने में सक्षम था। मस्टर और यह ठीक काम किया! यह वास्तव में मेरे लिए आश्चर्यजनक है क्योंकि मैंने अपनी सीएसपीआरजे फ़ाइल को संशोधित करने के लिए संशोधित किया है ताकि यह मेरे विचारों को संकलित कर सके। क्या मैं गलत समझ रहा हूं कि यह सेटिंग क्या करती है? मैंने सोचा कि सभी अस्थायी असेंबली हटा दी गई है और क्या नहीं? – Jaxidian

+1

दृश्य हमेशा संकलित किए जाते हैं, अंतर यह है कि आप या तो एक ही समय में सब कुछ आगे संकलित कर सकते हैं या साइट पर पहली बार पहुंचने पर आप उन्हें मांग पर संकलित कर सकते हैं। किसी भी तरह से, वे अभी भी एक अलग डीएलएल में संकलित किया जाएगा। –

15
बस एक और समाधान है कि लोगों में, मैं इन सहायकों इस समस्या के साथ मदद करने के लिए ही गाढ़ा किया है दिलचस्पी हो सकती है के रूप में

:

Version: <%= Html.CurrentVersion() %> from <%= Html.CurrentVersionDate() %> 
: अपने पाद लेख में इस प्रकार

public static class HtmlHelperExtensions 
{ 
    private static string _CachedCurrentVersionDate; 

    /// <summary> 
    /// Return the Current Version from the AssemblyInfo.cs file. 
    /// </summary> 
    public static string CurrentVersion(this HtmlHelper helper) 
    { 
     try 
     { 
      var version = Assembly.GetExecutingAssembly().GetName().Version; 
      return version.ToString(); 
     } 
     catch 
     { 
      return "?.?.?.?"; 
     } 
    } 

    public static string CurrentVersionDate(this HtmlHelper helper) 
    { 
     try 
     { 
      if (_CachedCurrentVersionDate == null) 
      { 
       // Ignores concurrency issues - assuming not locking this is faster than 
       // locking it, and we don't care if it's set twice to the same value. 
       var version = Assembly.GetExecutingAssembly().GetName().Version; 
       var ticksForDays = TimeSpan.TicksPerDay * version.Build; // days since 1 January 2000 
       var ticksForSeconds = TimeSpan.TicksPerSecond * 2 * version.Revision; // seconds since midnight, (multiply by 2 to get original) 
       _CachedCurrentVersionDate = new DateTime(2000, 1, 1).Add(new TimeSpan(ticksForDays + ticksForSeconds)).ToString(); 
      } 

      return _CachedCurrentVersionDate; 
     } 
     catch 
     { 
      return "Unknown Version Date"; 
     } 
    } 
} 

यह खपत की अनुमति देता है

+1

डेलाइट सेविंग टाइम के कारण समायोजन समय गणना के लिए जिम्मेदार नहीं है। –

3

यदि आपके पास पहले से ही Global.asax है, तो यह वैश्विक स्तर पर संस्करण को स्टोर करने के लिए एक अच्छी जगह हो सकती है।

Global.asax.cs:

public class Global : HttpApplication 
{ 
    public static readonly Version Version = Assembly.GetExecutingAssembly().GetName().Version; 
} 

आपका दृश्य:

<div>- Version: @YourNamespace.Global.Version</div> 
+0

दुर्भाग्यवश यह परीक्षण योग्य नहीं है। – abatishchev

8

आप कर सकते हैं:

वैश्विक में अपने Application_Start विधि में

उदा।asax फ़ाइल 1.0.0 के लिए जोड़

<div><% =HttpContext.Current.Application["Version"].ToString() %></div> 

भी विधानसभा बदलें संस्करण द्वारा

protected void Application_Start(object sender, EventArgs e) 
{ 
    HttpContext.Current.Application.Add("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); 
} 
HTML में

यह दिखाने * पर जाकर -। प्रोजेक्ट के गुण> अनुप्रयोग> विधानसभा सूचना और विधानसभा संस्करण है 1.0.0.0 के रूप में दिखाया गया - इसे 1.0.0 में बदलें। *

इससे आपको कुछ संस्करण

+0

हालांकि यह विभिन्न चाल/जटिलता जोड़कर टेस्टेबल बन जाता है। – abatishchev

संबंधित मुद्दे