2010-12-10 2 views
0

J'écris une DLL d'encapsulation dans C++ managé (/ clr) pour une DLL native avec Visual Studio 2008. Cette DLL d'encapsulation sera utilisée pour les langages de programmation .NET, comme C#.Opérateur de conversion explicite en C++ managé pour une DLL .NET

J'ai des problèmes avec ma mise en œuvre d'un opérateur explicite coulé à System :: String. La diffusion fonctionne dans un programme de test C++ géré, mais pas dans un programme de test C#.

C'est l'erreur que je reçois dans le programme C#:

error CS0030: Cannot convert type 'Field' to 'string' 

Voici une version simplifiée de la façon dont je l'ai fait:

public ref class Field 
{ 
private: 
    FieldNative* nativeObj; 

public: 
    Field() 
    { 
     nativeObj = new FieldNative(); 
    } 

    ~Field() 
    {   
     delete nativeObj; 
    } 

    explicit operator System::String^(void) 
    {  
     const char* value = (const char*) *nativeObj; 
     return gcnew System::String(value, 0, nativeObj->size()); 
    } 
}; 

L'objet natif met en œuvre la coulée de const char *, donc cela fonctionne. Je peux même l'utiliser dans un autre programme C++ géré. Cependant, il ne fonctionne pas en C#.

Voici comment la propriété est exposée dans l'Explorateur d'objets de VS2008:

Field.explicit operator string() 

public explicit operator string() 
Member of Field 

Comment dois-je mettre en œuvre l'opérateur explicite coulé dans Managed C++ il est donc utilisable en C# ou tout autre langage .NET?

Répondre

2

C# doit être statique opérateurs. Écrivez comme ça pour le faire fonctionner:

static explicit operator System::String^(Field^ obj) 
    {  
     // etc.. 
    } 
+0

Votre code n'est pas un code C# –

+0

@Saeed - non, il est C++/CLI, la langue que l'OP utilise. –

+0

Merci, Hans! Votre suggestion fonctionne. –

Questions connexes