2009-12-22 21 views
4

Je souhaite écrire une petite application d'installation qui installe un site Web et crée des répertoires virtuels IIS. L'application devrait fonctionner sur Windows XP/Server 2003 (IIS 6) ainsi que sur Vista/2008 (IIS 7). Le problème est le suivant: pour IIS 6, nous créons des répertoires virt en appelant l'API WMI/Metabase. Pour IIS 7, il existe une API bien meilleure: Microsoft.Web.Administration, mais son assemblage n'est disponible que sur les systèmes IIS 7.Quand le CLR essaie-t-il de charger un assembly référencé?

approche Naive:

... 
if (OperatingSystem == old) 
{ 
    call metabase API... 
} 
else 
{ 
    call Microsoft.Web.Administration... 
} 
... 

Nice, est-ce pas? Mais comment puis-je m'assurer que cela ne plante pas sur un ancien système juste en essayant de charger la DLL Microsoft.Web.Administration? Ou est-ce qu'un assemblage vient d'être chargé, quand il est utilisé pour la première fois? Lorsqu'une méthode qui appelle dans l'assembly est d'abord utilisée?

Je suppose que le test n'aide pas sans un certain déterminisme garanti par les spécifications CLR/.NET.

Je suis vraiment impatient d'entendre vos expériences, des conseils ou des solutions pour ce sujet. Je n'ai rien trouvé d'utilisable sur le web jusqu'à présent.

Répondre

1

Je n'ai pas pu trouver la réponse définitive comme dans une spécification indiquant quand les assemblages doivent et ne doivent pas être chargés. Toutefois, selon

http://msdn.microsoft.com/en-us/magazine/cc163655.aspx (section "Load Modules moins au démarrage")

et l'extrait de livre à www.informit.com/articles/article.aspx?p=30601 & seqnum = 5 (extrait de "Essential .NET, Volume I: Le Common Language Runtime"). Le JIT du CLR chargera un assemblage nécessaire uniquement lorsque cela est nécessaire pour compiler une méthode. Ainsi, vous devez déplacer toute utilisation de Microsoft.Web.Administration ... vers une méthode séparée qui n'est appelée que lorsque vous êtes sûr que l'assembly existe sur le système. C'est,

setup() 
    { 
     if (Operating.System == Old) 
      call metabase API 
     else 
      doIIS7Setup() 
    } 

    void doIIS7Setup() 
    { 
    call Microsoft.Web.Administration .... 
    } 
1

Personnellement, plutôt que d'essayer de compter sur un comportement intrinsèque du JIT, je déplace la dépendance à l'égard Microsoft.Web.Administration à un autre ensemble tout à fait. Ensuite, quelque part dans l'assembly appelant, je vérifie pour voir si %systemroot%\inetsrv\Microsoft.Web.Administration.dll est présent. Si c'est le cas, je suppose que j'utilise l'interface gérée et appelle l'assembly; sinon, je reviendrai à l'API de la métabase.