Comme nous le savons tous, dans le monde .net, les programmeurs sont uniquement responsables de la création d'objets en utilisant new, et la destruction des objets est entièrement laissée au garbage collector. Ce n'est que lorsque le garbage collection a lieu que les types dans .net seront détruits. Cela ne provoque généralement rien de mal. Toutefois, des problèmes particuliers surviennent lors de l'utilisation d'objets COM non gérés.
COM utilise le comptage de références pour déterminer la durée de vie de l'objet. Chaque fois que le client COM fait référence à l'objet, il l'appelle.
IUnKnown->AddRef(), et chaque fois que l'objet est libéré, il est appelé
IUnKnown->Release(), libère l'instance une fois que le nombre de références atteint zéro.
Le problème se pose, regardons le code suivant :
Il s'agit d'un code C# qui utilise le composant Excel com pour exporter des fichiers Excel vers le client qui est largement diffusé dans la version asp.net de CSDN. Avant d'ajouter ce code, l'assistant d'ajout de références com a été exécuté.
Excel.Application oExcel ;
Excel.Workbook oBook ;
Objet oMissing = System.Reflection.Missing.Value ;
oExcel = new Excel.Application();
oBook = oExcel.Workbooks.Add (oMissing);
pour (int i=1;i <=4;i++)
{
oExcel.Cells[i,1]=i.ToString();
oExcel.Cells[i,2]= "'bbb2 ";
oExcel.Cells[i,3]= "'ccc3 ";
oExcel.Cells[i,4]= "'aaa4 ";
}
oBook.Saved = vrai ;
oExcel.UserControl = faux ;
chaîne nom de fichier = DateTime.Now.Ticks.ToString();
string mm=Server.MapPath( ".")+ "\" + nom de fichier + ".xls";//Adresse de stockage du serveur
oExcel.ActiveWorkbook.SaveCopyAs (mm);
oExcel.Quit();
//GC.Collect();
Réponse.Redirect(nom de fichier+".xls");
Ce code peut réaliser la fonction d'exportation de fichiers, mais si vous regardez le Gestionnaire des tâches de Windows, vous trouverez la merveilleuse scène illustrée ci-dessous.
Ainsi, quelqu'un a ajouté "GC.Collect();" au code. Très bien, il n'y a pas autant d'EXCEL.EXE, comme indiqué ci-dessous.
Mais comment pouvons-nous parvenir à une libération complète ?
Heureusement, dans .net, les programmeurs sont autorisés à appeler explicitement la méthode Release de com. Cette méthode est packagée par .net et s'appelle System.Runtime.InteropServices.Marshal.ReleaseComObject.
Avant d'appeler "GC.Collect();", appelez d'abord "System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);"
Décrémentez le nombre de références de un, de sorte que le nombre de références devienne zéro. Lorsque le garbage collection se produit, l'objet COM correspondant à oExcel sera balayé.