2010-09-15 11 views
0

je besoin d'un avis sur la rédaction d'un wrapper managé (C#) pour un environnement non géré C++ DLL.conception wrapper pour DLL avec P/Invoke

Disons que j'ai un objet comme celui-ci:

public class ManagedObject 
{ 
    public void DoSomethingWithTheObject() 
    { 

    } 
} 

et supposons que la méthode DoSomethingWithTheObject() doit faire un appel à la méthode de DLL non géré.

Maintenant il y a deux possibilités acceptables qui me viennent à l'esprit:

public void DoSomethingWithTheObject() 
{ 
    DllWrapperClass.DirectCallToUnmanagedMethod(some_value_type); 
} 

et

public void DoSomethingWithTheObject() 
{ 
    DllWrapperClass.MethodName(this); 
} 

Ce que je demande au fond est si

  1. la classe wrapper devrait simplement être un wrapper aux méthodes non managées et tous les objets appellent ces méthodes directement

  2. la classe d'emballage doit être bien intégré avec les objets et se cachent autant de « façon non géré » de travailler comme possbile

Je penche vers la deuxième option, mais je voudrais d'entendre d'autres opinions que les deux moyens ont leurs propres avantages et inconvénients.

Répondre

4

Option 2. C'est l'un des principes qui sous-tendent le .NET Framework lui-même: fournir un ensemble de bibliothèques gérées qui sont compatibles quelle que soit la forme des API non gérés, ils enveloppent.

Votre emballage doit suivre le .NET Class Library Design Guidelines dans la mesure du possible. Vous saurez que vous êtes sur la bonne voie lorsque votre enveloppe gérée commencera à se sentir pure en C# au lieu d'une couche sur une DLL non gérée.

+0

Merci. J'avais exactement les mêmes pensées. –

+0

1+. Pour votre meilleure réponse. – Aliostad

2

Comme vous l'avez compris, la deuxième option est toujours préférable, mais maintenant toujours possible. Il est préférable de résumer les parties non gérées ou non sécurisées, mais parfois, l'application client doit prendre des décisions ou fournir de nombreuses informations. Dans ce dernier cas, vous finissez par écrire de nombreuses classes qui imitent seulement leurs homologues non gérés.

En général, masquez autant que vous le pouvez.