2010-08-02 16 views
6

Im écrit un composant de bibliothèque de classe C# qui va agir comme un serveur TCP. Il écoute et reçoit XML via un port spécifique, le désérialise puis déclenche des événements contenant l'objet résultant en tant qu'argument d'événement.C#: Élimination correcte des objets C# lors de la création via COM Interop à partir de VB6

La bibliothèque de classes elle-même sera consommée par une application VB6 qui recevra et traitera les événements et les objets de classe visibles COM associés.

La classe TcpServer encapsule la fonction TcpListener et n'est pas visible COM. Cela gère les connexions et soulève des événements traitant des connexions, des déconnexions et des données reçues. WUServer est la classe COM visible créée et utilisée par l'application VB6. Il encapsule la classe TcpServer et est responsable de la désérialisation des données reçues et de la génération de l'événement approprié avec les arguments d'événement associés.

public class WUServer : IWUServer 
{ 
    private TcpServer tcpServer; 

    public WUServer() 
    { 
     tcpServer = new TcpServer(12345); 
     tcpServer.DataReceived += new EventHandler<DataReceivedEventArgs>(tcpServer_DataReceived); 
     tcpServer.SocketConnected += new EventHandler<IPEndPointEventArgs>(tcpServer_SocketConnected); 
     tcpServer.SocketDisconnected += new EventHandler<IPEndPointEventArgs>(tcpServer_SocketDisconnected); 
    } 
} 

Le problème que j'ai est que la classe TcpServer n'est pas éliminée correctement par l'application VB6. Définir l'instance de WUServer sur Nothing avant la fermeture de l'application n'aboutit pas à la destruction de la classe TcpServer, elle continue à s'accrocher au socket et génère des erreurs si je tente à nouveau d'exécuter l'application VB6.

Si je consomme la classe WUServer à partir d'une application C#, tout va bien, Dispose est appelé sur TcpServer et le socket est fermé.

Comment puis-je m'assurer que la classe TcpServer est correctement éliminée lorsqu'elle est créée indirectement par l'application VB6?

Répondre

8

vous pouvez ajouter une méthode publique à WUServer que vous appelez explicitement dans VBA à l'intérieur de cette méthode libérer votre serveur TCP

void Close() 
{ 
tcpServer.Dispose(); 
} 
+3

+1 Ceci est la solution. Com Callable Wrappers ne prête aucune attention à IDisposable. En voici quelques unes [explication de Sam Gentile] (http://radio-weblogs.com/0105852/stories/2002/12/21/comInteropNotFundamentallyFlawedButHard.html) – MarkJ

+0

Merci à vous deux, le lien a également été très utile. – Andrew