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

时间:2010-07-09 09:13:22

标签: c# reflection

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

Assembly assembly = useEntryAssembly ? Assembly.GetEntryAssembly() : Assembly.GetCallingAssembly();

3 个答案:

答案 0 :(得分:4)

除非您经常进行这样的通话,否则费用相当微小,我不会担心。

在我的计算机上Assembly.GetEntryAssembly()在调试模式下随机运行时第一次需要164个滴答,而下一个则需要7个滴答。如果没有使用Reflector潜水太深,它似乎会缓解这些电话。

我的机器上每秒有2597734个刻度,因此164对7仍然不重要。

答案 1 :(得分:2)

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

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

private static Assembly _entryAssembly;

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

现在你不必担心这个电话有多贵;虽然可能,作为另一个答案评论的评论者,也许框架实际上是为你做的。

[注意:这故意不是一个线程安全的单例 - 最糟糕的情况是,如果第一次被几个线程同时访问,你会调用Assembly.GetEntryAssembly()几次 - 不值得尝试锁定这个场景IMHO]

答案 2 :(得分:1)

我不了解性能,但这取决于您将使用此Assembly对象的代码气味。

由于你可以typeof(Anything).Assembly找到一个程序集,你已经知道你所在的程序集没有调用它们。编译器可以检查typeof关键字,而GetEntryAssemblyGetCallingAssembly的结果可能会让您感到惊讶。 (例如,GetEntryAssembly可以是null。)

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