2010-02-25 8 views
1

J'ai rencontré un problème intrigant. J'ai une application faite de plusieurs assemblées. J'ai installé l'application mais j'ai oublié un petit assemblage non essentiel. L'application a semblé commencer et fonctionner correctement jusqu'à ce que je frappe une méthode qui nécessite l'utilisation de cet assemblage. Comme vous l'avez déjà deviné, je vois l'exception "Could not load file or assembly 'Blah, Version=1.0.0.0, Culture=neutral, PublicKeyToken=Blah' or one of its dependencies. The system cannot find the file specified.".Compilation JIT avec des références d'assemblage manquantes

Pas de surprise là non? Oui, le programme d'installation a pu être réparé et mon problème disparaît, mais je voulais voir s'il y avait une manière programmatique de le faire. J'ai donc essayé envelopper le code qui utilise l'ensemble non essentiel dans un bloc d'essai et libérer la ressource coûteuse dans le bloc finally comme ceci:

public void MethodA() 
{ 
    try 
    { 
     // Do stuff with non essential assembly 
    } 
    finally 
    { 
     // Release expensive resource here 
    } 
} 

Pensant que le compilateur JIT va jeter à l'intérieur du bloc try, à terme, rendre le contrôle au bloc enfin et ma ressource est libérée. Il s'avère que le compilateur JIT jette au moment où la méthode est appelée.

J'ai pensé à déplacer le bloc finally plus haut dans la chaîne d'appel, mais cette méthode est appelée à partir de centaines de lieux. J'ai pensé à utiliser Assembly.Load pour l'assemblage non essentiel mais l'idée de devoir utiliser la réflexion me fait me sentir sale.

Y a-t-il un moyen de faire exécuter le bloc finally dans ce cas sans trop se restructurer ou devoir prendre une douche, je veux dire, utiliser la réflexion?

+0

vous faites un bon argument pour les tests unitaires non destructifs qui sont expédiés (et testables) dans une application installée. – si618

Répondre

1

Définir une autre méthode qui effectue vos tâches avec l'assemblage non essentiel.

Appel à partir de la méthode A.

Alors:

public void MethodA() 
{ 
    try 
    { 
     MethodAImpl(); 
    } 
    finally 
    { 
    } 
} 
+0

C'est ce que j'ai dû faire mais je me demandais s'il y avait peu d'indice de compilateur connu. – tgeros

1

Si l'ensemble est non essentiel alors il n'y a pas de problème avec l'utilisation de la charge de l'Assemblée. Je ne vois pas pourquoi tu penses que c'est sale. La réflexion est juste un autre aspect de .NET

+0

Tous les développeurs qui vont toucher le code ne comprennent pas la réflexion – tgeros

+0

Cher ou cher. Désolé - mais ne devraient-ils pas l'apprendre alors? –

+0

Pour certaines personnes, c'est juste un travail - et ça me va. – tgeros

Questions connexes