2009-02-23 8 views
1

Utilisation de Visual Studio 2005.Différence de chargement de la dll entre les modes de débogage et de libération

Voici un exemple intéressant.

Pour reproduire, créez une nouvelle solution avec l'application Windows et la bibliothèque de classe .

Dans la bibliothèque de classe, définir la classe comme ceci:

public class SomeClassInDLL 
{ 
    public string DoSomething() 
    { 
     return DateTime.Now.ToString(); 
    } 
} 

Télécharger l'application Windows pour faire référence à la bibliothèque de classes. Ajouter un bouton, et ajoutez ce code:

private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      MessageBox.Show("about to call DoSomething"); 
      string ret = DoCall(); 
      MessageBox.Show(ret); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("error : " + ex.GetType().ToString() + " " + ex.Message); 

     } 
    } 

    private string DoCall() 
    { 
     SomeClassInDLL c1 = new SomeClassInDLL(); 
     return c1.DoSomething(); 
    } 

1) Compiler l'application dans les deux modes de débogage et Release. (Dans le bac \ Debug et bin \ répertoires de sortie)

2) Fermez Visual Studio et exécuter Windows application à partir de l'explorateur de Windows

3) Cliquez sur le bouton 1.

4) Lorsque la " sur le point d'appeler DoSomething "dialogue apparaît, dans Windows Explorer, essayez de supprimer le fichier dll référencé.

5a) si vous exécutiez la version en mode débogage à l'étape 2: vous pouvez supprimer le fichier dll successfully.This est ce que je pense, puisque la dll est appelé dans la fonction DoCall, et non pas directement dans button1_Click.

5b) si vous avez exécuté la version du mode de publication à l'étape 2: vous ne pouvez pas supprimer le fichier dll , car il semble être verrouillé par l'application.

==

5a) est le comportement que je suis venu à attendre, depuis dotnet 1.1 jours. Des idées pourquoi 5b) semble verrouiller la DLL plus tôt que nécessaire? Quelque chose à voir avec l'optimisation peut-être? Est-ce que ce type de comportement de chargement dll est expliqué quelque part?

TIA.

Répondre

1

En mode édition, la fonction DoCall est susceptible d'être incorporée dans le gestionnaire d'événements de clic de bouton.

Cela signifie le type chargeur doit savoir sur SomeClassInDll beaucoup plus tôt (d'où le verrou sur la dll)

Notez que se fondant sur ce comportement est dangereux, la charge de type peut facilement être déclenché par la réflexion, par des changements dans l'heuristique inline ou par des changements dans le loader de type (rendant le chargement jit spéculatif de méthodes dépendantes par exemple - bien que cela soit peu probable)

Questions connexes