Когда .net проверяет зависимости сборки? - PullRequest
4 голосов
/ 14 сентября 2010

Преследуя отдельную проблему Я попал в очень странную ситуацию. Демо-код будет:

public class Global : HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        Log("In Application_Start");
        SomeClass.SomeProp = ConfigurationManager.AppSettings["PropValue"];
    }
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        Log("In Application_BeginRequest");
        try
        {
            this.Application_Start(null, null);
        }
        catch ( Exception ex )
        {
            Log(ex.ToString());
        }
        Log("At the end of Application_BeginRequest");
    }
}

Что я получаю в своем журнале:

In Application_BeginRequest

Could not load file or assembly 'vjslib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
System.IO.FileNotFoundException
    at MyRootNamespace.Global.Application_Start(Object sender, EventArgs e)
    at MyRootNamespace.Global.Application_BeginRequest(Object sender, EventArgs e) in D:\My Documents\Visual Studio 2008\Projects\SolutionDir\ProjectDir\Global.asax.cs:line 109

At the end of Application_BeginRequest

Это не имеет никакого смысла для меня вообще. Рассмотрим:

  • vjslib ссылается мой основной проект (сборка), который включает класс Global. Почему сборка вообще загружалась, если не удалось разрешить ее зависимости?
  • SomeClass находится в другой сборке, которая также ссылается на vjslib. SomeClass использует vjslib, и некоторые члены предоставляют классы, которые являются производными от классов в vjslib, но используемое здесь свойство - это просто старая старая строка.
  • Почему в первой строке трассировки стека нет номера строки?

Разрешены ли зависимости для каждого метода? Я думал, что Microsoft больше не делает таких вещей . Что здесь происходит?

1 Ответ

4 голосов
/ 14 сентября 2010

Я полагаю, что когда CLR встречает ссылку на некоторый тип в IL, он пытается загрузить его. И они могут привести к загрузке сборки. Таким образом, все зависимые сборки не обязательно загружаются при запуске - они будут загружаться по требованию.

Редактировать: см. Этот вопрос на SO о загрузке сборки. В книге "CLR через C #" также говорится о загрузке сборки при вводе текста, обнаруженного JIT в IL.

...