代码之家  ›  专栏  ›  技术社区  ›  superlogical

C#昂贵的方法调用?Assembly.GetEntryAssembly()和Assembly.GetCallingAssembly()

  •  4
  • superlogical  · 技术社区  · 14 年前

    我刚看到这行C代码,我想知道它是否昂贵

    Assembly assembly = useEntryAssembly ? Assembly.GetEntryAssembly() : Assembly.GetCallingAssembly();
    
    3 回复  |  直到 14 年前
        1
  •  5
  •   Mikael Svenson    14 年前

    除非你经常打这样的电话,否则费用很小,我不会担心的。

    在我的机器上 Assembly.GetEntryAssembly() 在调试模式下随机运行时,第一次执行164次,第二次执行7次。在没有深入反射器的情况下,它似乎在缓存通话。

    我的机器上每秒有2597734个滴答声,所以164对7还是不重要的。

        2
  •  2
  •   Rob Levine    14 年前

    除非你经常打这些电话,否则我不会担心的。无论如何,你可以做一些简单的优化。

    Assembly.GetEntryAssembly() 在进程的生命周期内不会更改(对于给定的AppDomain),因此无需重复执行此调用,即使您需要访问它。您可以将其替换为:

    private static Assembly _entryAssembly;
    
    private Assembly ExecutingAssembly
    {
      get 
      { 
        if (_entryAssembly == null )
        {
          _assembly = Assembly.GetEntryAssembly();
        }
        return _entryAssembly
    }
    

    现在你不用担心这个电话有多贵;尽管有可能,作为另一个答案的评论者,也许框架实际上为您做到了这一点。

        3
  •  1
  •   Tim Robinson    14 年前

    我不知道性能如何,但这是一种代码味道,取决于你要用什么 Assembly 的对象。

    既然你能做到 typeof(Anything).Assembly typeof 关键字可以由编译器检查,而 GetEntryAssembly GetCallingAssembly 会让你大吃一惊(例如, GetEntryAssembly程序集 可以是 null

    了解您需要从这个程序集中获取哪些信息会有所帮助—可能有更好的方法来检索它。