2009-03-07 6 views
0

Il y a une classe qui est compilé dans une dllComment nouveau mot-clé fonctionne en C#

//HeaderFile.h 
//version 1.0 
class __declspec(dllexport) A { 
    int variable; 
//member functions omitted for clarity 
}; 

//implementation file omitted for clarity 

Vous construisez un exe qui utilise au-dessus de la classe de la dll il a été compilé dans

#include "HeaderFile.h" 
int main() { 
    A *obj = new A(); 
    obj->CallSomeFuncOnObj(); 

    // 
    //whatever 
    // 
} 

Up jusqu'à maintenant Votre programme fonctionne bien. Mais maintenant, vous recompiler votre dll avec le code suivant

//HeaderFile.h 
//version 2.0 
class __declspec(dllexport) A { 
    int variable; 
    int anotherVariable; 
//member functions omitted for clarity 
}; 

//implementation file omitted for clarity 

et vous ne recompiler pas votre exe mais commencer à utiliser la dll recompilé de l'ancien exe. Qu'est-ce qui se passera maintenant, c'est que votre exe a le code allouer memory = sizeof (classe A version 1.0) mais le constructeur dans votre nouvelle DLL a un code qui suppose qu'il est passé un bloc de mémoire = sizeof (classe A version 2.0). Il existe une différence de taille d'un nombre entier entre les deux - une recette pour l'imprévisibilité.

Un exemple similaire est montré dans le premier chapitre d'un excellent livre - Essential COM de Don Box. Maintenant pour la question. Dans une situation similaire dans C# (ou toute autre lang .Net), que se passerait-il?

Répondre

2

Dans COM, votre DLL implémente une fabrique d'objets: La DLL crée l'objet lui-même afin d'éviter de tels problèmes 'syncho'. Dans .NET, le CLR instancie l'objet en fonction des connaissances de type extraites de la DLL où le type est implémenté. Dans les deux cas, le problème que vous évoquez est évité.

Questions connexes