Using the Web Application version number from an assembly (ASP.NET/C#)

后端 未结 12 974
我寻月下人不归
我寻月下人不归 2020-12-07 18:39

How do I obtain the version number of the calling web application in a referenced assembly?

I\'ve tried using System.Reflection.Assembly.GetCallingAssembly().GetName

相关标签:
12条回答
  • 2020-12-07 19:04

    To add to the responders that have already posted. In order to get the assembly version in an ASP.Net web application you need to place a method in the code behind file similar to:

    protected string GetApplicationVersion() {
        return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
    }
    

    In the ASPX page you want to display the version number simply place:

    <%= GetApplicationVersion() %>
    
    0 讨论(0)
  • 2020-12-07 19:07

    I find that the simplest one-liner way to get the version of your "main" assembly (instead of the dynamic one) is:

    typeof(MyMainClass).Assembly.GetName().Version
    

    Use your top-level class, which isn't likely to ever "change its meaning" or to be replaced as part of a refactoring effort, as MyMainClass. You know in which assembly this very class is defined and there can no longer be confusion as to where the version number comes from.

    0 讨论(0)
  • 2020-12-07 19:07

    If you are looking for this from a web control, one hack is to find the type of the code-behind Page (ie. the class that inherits from System.Web.UI.Page). This is normally in the consumer's web assembly.

    Type current, last;
    current = Page.GetType();
    do
    {
        last = current;
        current = current.BaseType;
    } while (current != null && current != typeof(System.Web.UI.Page));
    return last;
    

    I hope there is a better way.

    0 讨论(0)
  • 2020-12-07 19:08

    I encountered a similar problem, and thought you might find the solution useful.

    I needed to report the current application version (of a web application project) from a custom server control, where the server control was contained in a different library. The problem was that the "easiest" assembly getters did not provide the right assembly.

    • Assembly.GetExecutingAssembly() returned the assembly containing the control; not the application assembly.
    • Assembly.GetCallingAssembly() returned different assemblies depending on where I was at in the call tree; usually System.Web, and sometimes the assembly containing the control.
    • Assembly.GetEntryAssembly() returned null.
    • new StackTrace().GetFrames()[idx].GetMethod().DeclaringType.Assembly retrieves the assembly of a frame in the stack trace at index idx; however, besides being inelegant, expensive, and prone to miscalculation on the frame index, it is possible for the stack trace to not contain any calls to the application assembly.
    • Assembly.GetAssembly(Page.GetType()) scored me the App_Web_@#$@#$%@ assembly containing the dynamically generated page. Of course, the dynamic page inherits a class from my application assembly, so that led to the final solution:

    Assembly.GetAssembly(Page.GetType().BaseType)
    

    With the assembly reference in hand, you can drill to the version through its name:

    var version = Assembly.GetAssembly(Page.GetType().BaseType)
                          .GetName()
                          .Version;
    

    Now, this solution works because I had a reference to a type from the application assembly. We don't use any pages that do not inherit from a code behind, so it happens to be effective for us, but your mileage may vary if your organization's coding practices are different.

    Happy coding!

    0 讨论(0)
  • 2020-12-07 19:10

    So, I had to get the Assembly from a referenced dll.

    In the asp.NET MVC/WebAPI world, there is always going to be at least one class which inherits from System.Web.HttpWebApplication. The implementation below searches for that class.

    using System;
    using System.Linq;
    
    static Assembly GetWebAssembly() => AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.GetExportedTypes().Any(t => t.BaseType?.FullName == "System.Web.HttpApplication"));
    

    The above uses System.Linq in order to find that relationship, but this can also be implemented without.

    First, we get all loaded assemblies

    AppDomain.CurrentDomain.GetAssemblies()
    

    Then, enumerate through the IEnumerable<Assembly>, and get all of the types directly located in the assembly.

    a.GetExportedTypes()
    

    Then, see if any of the types inherit from System.Web.HttpWebApplication

    t.BaseType?.FullName == "System.Web.HttpApplication"
    

    In my implementation, I ensured this code would only be called once, but if that is not guaranteed, I'd highly wrapping this in a Lazy<T> or other cached lazy load implementation as it is rather expensive to keep performing the blind search.

    using System;
    using System.Linq;
    
    // original method
    private static Assembly GetWebAssembly() => AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.GetExportedTypes().Any(t => t.BaseType?.FullName == "System.Web.HttpApplication"));
    
    // lazy load implementation
    private static Lazy<Assembly> _webAssembly = new Lazy<Assembly>(GetWebAssembly);
    public static Assembly WebAssembly { get => _webAssembly.Value; }
    
    0 讨论(0)
  • 2020-12-07 19:13

    Some info here: http://www.velocityreviews.com/forums/showpost.php?p=487050&postcount=8

    in asp.net 2.0 each page is built into it own assembly, so only the dll the AssemblyInfo.cs is built into will return the correct answer. just add a static method to AssemblyInfo.cs that returns the version info, and call this method from your other pages.

    -- bruce (sqlwork.com)

    But I wrote a simple method to do that:

        public static string GetSystemVersion(HttpServerUtility server)
        {
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.Load(server.MapPath("~/web.config"));
            System.Xml.XmlNamespaceManager ns = new System.Xml.XmlNamespaceManager(doc.NameTable);
            ns.AddNamespace("bla", "http://schemas.microsoft.com/.NetConfiguration/v2.0");
    
            System.Xml.XmlNode node = doc.SelectSingleNode("/bla:configuration/bla:system.web/bla:authentication/bla:forms[@name]", ns);
    
            string projectName = "";
            if (node != null && node.Attributes != null && node.Attributes.GetNamedItem("name") != null)
                projectName = node.Attributes.GetNamedItem("name").Value; //in my case, that value is identical to the project name (projetname.dll)
            else
                return "";
    
            Assembly assembly = Assembly.Load(projectName);
            return assembly.GetName().Version.ToString();
        }
    
    0 讨论(0)
提交回复
热议问题