用于 Web 应用程序的 GetEntryAssembly

2024-01-03

Assembly.GetEntryAssembly()不适用于网络应用程序。

但是...我真的需要这样的东西。 我使用一些在 Web 和非 Web 应用程序中使用的深度嵌套代码。

我当前的解决方案是浏览 StackTrace 以查找第一个调用的程序集。

/// <summary>
/// Version of 'GetEntryAssembly' that works with web applications
/// </summary>
/// <returns>The entry assembly, or the first called assembly in a web application</returns>
public static Assembly GetEntyAssembly()
{
    // get the entry assembly
    var result = Assembly.GetEntryAssembly();

    // if none (ex: web application)
    if (result == null)
    {
        // current method
        MethodBase methodCurrent = null;
        // number of frames to skip
        int framestoSkip = 1;


        // loop until we cannot got further in the stacktrace
        do
        {
            // get the stack frame, skipping the given number of frames
            StackFrame stackFrame = new StackFrame(framestoSkip);
            // get the method
            methodCurrent = stackFrame.GetMethod();
            // if found
            if ((methodCurrent != null)
                // and if that method is not excluded from the stack trace
                && (methodCurrent.GetAttribute<ExcludeFromStackTraceAttribute>(false) == null))
            {
                // get its type
                var typeCurrent = methodCurrent.DeclaringType;
                // if valid
                if (typeCurrent != typeof (RuntimeMethodHandle))
                {
                    // get its assembly
                    var assembly = typeCurrent.Assembly;

                    // if valid
                    if (!assembly.GlobalAssemblyCache
                        && !assembly.IsDynamic
                        && (assembly.GetAttribute<System.CodeDom.Compiler.GeneratedCodeAttribute>() == null))
                    {
                        // then we found a valid assembly, get it as a candidate
                        result = assembly;
                    }
                }
            }

            // increase number of frames to skip
            framestoSkip++;
        } // while we have a working method
        while (methodCurrent != null);
    }
    return result;
}

为了确保组装是我们想要的,我们有3个条件:

  • 该程序集不在 GAC 中
  • 装配体不是动态的
  • 不生成程序集(以避免临时 asp.net 文件

我遇到的最后一个问题是当基页在单独的程序集中定义时。 (我使用 ASP.Net MVC,但它与 ASP.Net 相同)。 在这种特殊情况下,返回的是单独的程序集,而不是包含页面的程序集。

我现在正在寻找的是:

1)我的装配验证条件是否足够? (我可能忘记了案例)

2) 有没有办法从 ASP.Net 临时文件夹中给定的代码生成的程序集获取有关包含该 Page / View 的项目的信息? (我想不是,但谁知道呢......)


这似乎是获取 Web 应用程序的“入口”或主程序集的可靠且简单的方法。

如果将控制器放在单独的项目中,您可能会发现 ApplicationInstance 的基类与包含视图的 MVC 项目不在同一个程序集中 - 但是,这种设置似乎很少见(我提到它是因为我已经尝试过这个曾经设置过,不久前一些博客支持了这个想法)。

    static private Assembly GetWebEntryAssembly()
    {
        if (System.Web.HttpContext.Current == null ||
            System.Web.HttpContext.Current.ApplicationInstance == null) 
        {
            return null;
        }

        var type = System.Web.HttpContext.Current.ApplicationInstance.GetType();
        while (type != null && type.Namespace == "ASP") {
            type = type.BaseType;
        }

        return type == null ? null : type.Assembly;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于 Web 应用程序的 GetEntryAssembly 的相关文章

随机推荐

  • 如何获取 JQuery 回调函数中的对象引用?

    假设我们有一个名为 aObject 的 javascript 对象 并且 test 函数用作 JQuery 中的回调函数 var aObject aVariable whatever value test function Trying t
  • 如何在Java中将时间戳转换为纪元/纳秒?

    我有一个Date的价值Tue Mar 27 17 57 35 PDT 2018 我正在尝试将其转换为纳米 纪元时间格式 我试过了 Date ts data get timestamp getTime Instant ts data get
  • 按钮 onclick 函数触发两次

    我有一个使用事件处理程序调用 JavaScript 函数的按钮 由于某种原因 事件处理程序被调用两次 这是我的按钮 我使用 php 对象来生成代码 这就是为什么有很多空标签的原因
  • 在运行时使用 makefile 复制文件

    我曾经在 Windows 上使用批处理脚本来编译程序 但最近我发现 makefile 效率更高 我的里面有这条线 bat复制一些dll的文件to运行时的当前目录并且运行良好 copy C lib glfw glfw dll 我在我的 mak
  • 如何获得CRC64分布式计算(利用其线性特性)?

    我需要对存储在分布式文件系统上的相当大的文件进行哈希处理 我能够以比整个文件更好的性能处理文件的某些部分 因此我希望能够计算各部分的哈希值 然后对其求和 我在想CRC64作为哈希算法 但我不知道如何使用其理论上的 线性函数 属性 以便我可以
  • Windows 10 (UWP) 编码 UI

    Visual Studio 2015 中没有适用于 UWP 的编码 UI 项目 而且我在任何地方都找不到任何说明有计划提供支持的文档 有谁知道是否有计划支持它或有一些替代的 UI 测试框架与 Windows Universal 一起使用 我
  • IIS 无法为用户访问 Excel 文件,但对我来说没问题。为什么?

    我有一个程序在 Windows Server 2008 R2 的 IIS 中作为服务运行 该程序在 Excel 中创建报告没有问题 当它尝试访问刚刚创建的 Excel 时 就会出现问题 这会在这行代码处向用户提供 80070005 错误 E
  • React with TypeScript - 如何导入方法

    在 React with TypeScript 中 我收集您使用以下命令导入import as React from react 如果我想使用useState and Fragment例如 我知道我可以使用React useState an
  • 如何在不使用reverse=True参数的情况下对字符串列表进行逆序排序?

    我想以相反的顺序对字符串列表进行排序 例如 my list aaa bbb ccc 预期结果 ccc bbb aaa 我不想使用sorted my list reverse True 因为在更复杂的情况下 当按两个值进行过滤时 它不起作用
  • iOS Swift - 如何使用核心数据存储数组?

    我是 iOS 开发新手 想知道应该指定哪种数据类型来存储多个字符串 数组 该应用程序与食物有关 我需要将多种成分存储为一个属性 我正在考虑将成分作为实体 但我只是想让初学者变得容易 我读过有关可转换类型的内容 但人们似乎不建议使用它来存储数
  • 如何在React中更改MUI Datepicker输入框的高度

  • 测试 ClickOnce 应用程序

    您将使用什么方法在多个用户中测试 ClickOnce 应用程序的新版本 与当前版本并排 是否有任何最佳实践 特别是当应用程序依赖于不同服务器来实现 SQL Web 服务等的实时 测试版本时 我们使用内部 DNS 来设置http applic
  • 学习 Haskell 是为了学习 Scala

    我读过一些问题 例如 Scala vs Haskell 讨论两种语言的优点或学习哪种语言 但我已经知道我想学习 Scala 我在大学时是一名Java程序员 现在主要使用PHP 我想学习 Scala 因为它看起来像是个人项目中 Java 的改
  • 抑制 VSCode 中的 ESLint 警告

    我正在使用 ESLint扩大 https marketplace visualstudio com items itemName dbaeumer vscode eslint在 VSCode 中格式化并检查我的 JavaScript 代码
  • 将我的应用程序添加到 tvOS 应用程序设置屏幕

    How do you add app settings to tvOS like you do in iOS I assume that just like iOS the screen below you can add the sett
  • 当滚动离开视图 android 时,项目动画在 recyclerview 中停止

    我有一个 Recyclerview 我正在为单个列表项内的视图设置动画 但是当我滚动 recyclerview 时 动画停止 这是因为 recyclerview 会从其视图中删除项目 因此当我们向后滚动时 它会将其取回 但现在我希望该动画继
  • 垂直对齐字体很棒的图标与
  • 内的文本
  • 我有一个使用很棒的字体的列表 因此它的类是fa ul ul class fa ul li class dept i class fa li fa fa stop i span Management span li li class dept
  • 在Linux中,为什么所有进程都有一个全局的/dev/stdin文件?

    不同进程的标准输入不应该是唯一的吗 如果是这样 标准输入文件的路径不应该是这样的 dev pid stdin而不是全局的 dev stdin 有人对此有想法吗 dev stdin是独一无二的 因为 它是一个符号链接 proc self fd
  • MFMessageComposeViewController 不工作

    我有一种简单的方法 可以获取一个参数 然后发送一条消息 它不起作用 Code void sendSMS NSString text MFMessageComposeViewController viewController MFMessag
  • 用于 Web 应用程序的 GetEntryAssembly

    Assembly GetEntryAssembly 不适用于网络应用程序 但是 我真的需要这样的东西 我使用一些在 Web 和非 Web 应用程序中使用的深度嵌套代码 我当前的解决方案是浏览 StackTrace 以查找第一个调用的程序集