2010-11-24 10 views
3

Nous sommes confrontés à un problème d'interopérabilité, nous écrivons un client exe en C#, nous avons du code hérité écrit dans COM dll et une bibliothèque statique C++ native. Nous avons besoin d'utiliser les deux pour compléter les fonctionnalités du client C#. Nous avons ajouté la référence à COM dll en utilisant interop et en mesure de créer instance de la classe COM dans le code C#. Maintenant, ces méthodes de classe COM prennent des arguments qui sont des objets de C++ natif. Certaines classes de la classe COM ont besoin d'arguments qui sont des objets de classes déclarés dans la bibliothèque statique C++. Puisque nous ne pourrons pas créer d'instance de classes natives C++ dans C#, nous avons décidé d'écrire un wrapper C++/CLI sur une classe native et de créer une instance de warpper en code C# et d'accéder à l'instance de classe native via warpper et de la passer en classe COM créé en client C# Le problème est que lorsque nous passons le pointeur d'objet natif (comme IntPtr) à la classe COM, nous n'initialisons pas l'objet natif à ses valeurs. quel pourrait être le problème? Comment nous passons l'objet natif à travers un wrapper C++ géré vers du code C#?Instance C++ native dans le code managé en utilisant C++ wrapper

//Natvie C++ class 
class __declspec(dllexport) CConfiguration 
{ 

    public : 
     CConfiguration(void); 
     virtual ~CConfiguration(void); 
     void SetIPAddress(const char *IPAddress); 
     void SetPort(const char*Port); 
     void GetIPAddress(char *IPAddress); 
     void GetPort(char *Port); 
    Private: 
     std::string IPAddress; 
     std::string Port; 

} 


//Managed C++ Class 
public ref class ManagedConfigruation 
{ 
     public : 
     ManagedConfigruation(){} 
     ~ManagedConfigruation(){} 
     CConfiguration *myConfiguration;   
       IntPtr GetObjectOfConfigurationPtr();  
} 

IntPtr ManagedConfigruation::GetObjectOfConfigurationPtr() 
{ 
    myConfiguration = new CConfiguration(); 
    myConfiguration.SetIPAddress("127.0.0.1"); 
    myConfiguration.SetPort("6200"); 
    //Convert native object to IntPtr and return to C# class 
    return System::IntPtr(myConfiguration); 
}; 

//C# class on client exe 
public class CSharpClass 
{ 

    //Wrapper of Managed C++ class 
    ManagedConfiguration objManagedConfiguration = new ManagedConfiguration(); 
    IntPtr objPtr = objManagedConfiguration.GetObjectOfConfigurationPtr(); 

    //Belwoo COMObject needs object of type CConfiguration native C++ class  
    COMObject.Initialize(objPtr); //Here is the problem object does not contain anything 


} 
+0

Ne devrait-il pas lire 'COMObject.Initialize (objPtr)'? –

+0

Merci paul l'a corrigé –

Répondre

1

Une méthode COM qui prend un pointeur brut comme ce n'est pas Automatisation compatible. C'est assez inhabituel, les méthodes COM prennent des pointeurs d'interface COM dans ce genre de scénario. Vous feriez mieux de vérifier avec le navigateur d'objets à quoi il ressemble après la conversion de la bibliothèque de types. Vous avez un problème lorsque le type d'argument est objet.

Il est peut-être préférable de conserver le code de l'interface COM en C++/CLI.

0

Initialiser n'est pas une méthode COM, c'est notre propre méthode, qui prend comme argument IntPtr qui est en fait un objet C++ natif.