2010-09-14 3 views
4

Tout en poursuivant a spearate problem je suis venu à une situation très particulière. Un code de démonstration serait:Quand est-ce que .net vérifie les dépendances d'assembly?

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"); 
    } 
} 

Ce que je reçois dans mon journal est:

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 

Cela n'a aucun sens pour moi que ce soit. Tenir compte:

  • vjslib est référencé par mon projet principal (assemblage) qui comprend la classe Global. Pourquoi l'assembly a-t-il été chargé si ses dépendances n'ont pas pu être résolues?
  • SomeClass est dans un autre ensemble qui fait également référence à vjslib. SomeClass utilise vjslib et certains membres exposent des classes dérivées de classes dans vjslib, mais la propriété utilisée ici est simplement une ancienne chaîne.
  • Pourquoi n'y a-t-il pas de numéro de ligne dans la première ligne de la trace de la pile?

Les dépendances sont-elles résolues par méthode? Je pensais que Microsoft doesn't do such things anymore. Que se passe t-il ici?

Répondre

3

Je crois que lorsque le CLR rencontre une référence à un type dans IL, il tente de le charger. Et ils peuvent entraîner le chargement de l'ensemble. Donc, tous les assemblages dépendants ne sont pas forcément chargés au démarrage - ils seront chargés à la demande.

Édition: Voir cette question sur SO à propos du moment où l'assemblage est chargé. Le livre "CLR via C#" parle aussi de l'assemblage qui est chargé lors du typage rencontré par JIT dans IL.

+0

C'est une possibilité, mais lisez ensuite mon dernier lien (celui sur "Microsoft ne fait plus de telles choses"). –

+1

@Vilx, le lien que vous avez fourni ne parle que des DLL non managées référencées par l'importation DLL et non des assemblées managées. Les assemblages gérés ne sont pas référencés par des fonctions d'importation, mais ils sont référencés via des métadonnées (entrées AssemblyRef). BTW, j'ai édité ma réponse pour énumérer quelques autres sources. – VinayC

+0

Je pensais qu'ils auraient appris de leurs erreurs passées, même si elles ont été faites dans un autre département. Tant pis. Quoi qu'il en soit, merci pour le lien, qui a éclairci les choses! –

Questions connexes