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.