【问题标题】:Get web application assembly name, regardless of current executing assembly获取 Web 应用程序程序集名称,而不考虑当前正在执行的程序集
【发布时间】:2011-11-19 18:25:56
【问题描述】:

是否可以从引用的程序集获取 ASP.NET Web 应用程序的程序集名称??

Assembly.GetEntryAssembly 在桌面和控制台应用程序中运行良好,但在 Web 应用程序中似乎始终为空,并且 GetExecuting\GetCallingAssebly 返回我引用的程序集,而不是来自 Web 应用程序的程序集。


详细解释:

我写了一个自定义的Settings Provider,它不是从应用配置文件中读取配置,而是从一个集中的配置服务中获取设置。

自定义提供程序位于单独的程序集中,因此可以由不同的应用程序使用。

ApplicationName 属性需要被应用程序集名称覆盖。

使用提供者的方式是.net custom attribute,所以我不能向它发送任何参数。

由于 Assembly.Get*Assembly 方法似乎不起作用,我唯一能想到的就是需要一个带有应用程序名称的 web 应用程序的 appSetting,但我对此并不满意。对此的任何帮助表示赞赏,谢谢!

【问题讨论】:

    标签: c# .net asp.net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    我知道这是一个老问题,但这是我处理类似情况的方法。在我的情况下,a 使用另一个程序集来格式化字符串,其版本显示为具有相同核心的多个程序。

    Version v = null;
    var a = Assembly.GetEntryAssembly() ?? GetWebEntryAssembly() ?? Assembly.GetExecutingAssembly();
    SnapshotVersion = FileVersionInfo.GetVersionInfo(a.Location).ProductVersion;
    if (ApplicationDeployment.IsNetworkDeployed)
    {
        var d = ApplicationDeployment.CurrentDeployment;
        v = d.CurrentVersion;
        v = new Version(v.Major, v.Minor, v.Revision);
    }
    else
        v = a.GetName().Version;
    if (v != null)
        version = string.Format("{0}.{1}.{2}", v.Major, v.Minor, v.Build);
    

    因为这是在静态构造函数中,所以我需要做的就是从 Web 应用程序调用此静态类的任何属性,然后找到与静态类所在的程序集不同的最后一个调用程序集。这是通过 GetWebEntryAssembly 方法实现的。

    private static Assembly GetWebEntryAssembly()
    { 
        var frames = new StackTrace().GetFrames();
        var i = frames.FirstOrDefault(c => Assembly.GetAssembly(c.GetMethod().DeclaringType).FullName != Assembly.GetExecutingAssembly().FullName).GetMethod().DeclaringType;
        return Assembly.GetAssembly(i);
    }
    

    【讨论】:

      【解决方案2】:

      试试

      BuildManager.GetGlobalAsaxType().BaseType.Assembly
      

      【讨论】:

      • 我得到“在应用程序的预启动初始化阶段无法调用此方法。”尝试在 ASP.NET MVC 中使用此方法时出错。
      • 这将为我返回“mscorlib”。
      • 如果您的项目中没有包含 Global.asax 文件,这将不起作用。
      【解决方案3】:

      你可以使用

      HttpContext.Current.ApplicationInstance.GetType().Assembly
      

      【讨论】:

      • 它不工作:/ ... ApplicationInstance 在 Application_Start() 方法中为空(设置提供程序被初始化),并且在控制器内部返回一个奇怪的运行时生成的程序集(例如 App_global.asax。 hiqe17zm,版本=0.0.0.0,文化=中性,PublicKeyToken=null)
      • @Pabote:尝试获取其BaseType 的程序集(应在用户代码中定义)
      • 如果您的项目中没有包含 Global.asax 文件,这将不起作用。
      猜你喜欢
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 2018-07-09
      相关资源
      最近更新 更多