2010-12-10 10 views
0

Ich schreibe eine Wrapper-DLL in verwaltetem C++ (/ clr) für eine native DLL mit Visual Studio 2008. Diese Wrapper-DLL wird für .NET-Programmiersprachen verwendet. wie C#.Expliziter Umwandlungsoperator in verwaltetem C++ für eine .NET-DLL

Ich habe Probleme mit meiner Implementierung eines expliziten Cast-Operator zu System :: String. Casting funktioniert in einem verwalteten C++ - Testprogramm, jedoch nicht in einem C# -Testprogramm.

Dies ist der Fehler, den ich in der C# Programm zu erhalten:

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

Hier ist eine vereinfachte Version, wie ich es getan habe:

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()); 
    } 
}; 

Das native Objekt das Gießen zu const char implementiert *, so funktioniert das. Ich kann es sogar in einem anderen verwalteten C++ - Programm verwenden. Es funktioniert jedoch nicht in C#.

Dies ist, wie die Eigenschaft im Objektbrowser von VS2008 ausgesetzt:

Field.explicit operator string() 

public explicit operator string() 
Member of Field 

Wie muß ich den expliziten Cast-Operator in Managed C implementieren ++, so dass es in C# oder einer anderen .NET-Sprache verwendbar ist?

Antwort

2

C# erfordert, dass Operatoren statisch sind. Schreiben Sie es so, damit es funktioniert:

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

Ihr Code keine C# -Code ist –

+0

@Saeed - nein, ist es C++/CLI, die Sprache, dass der OP verwendet. –

+0

Danke, Hans! Dein Vorschlag funktioniert. –

Verwandte Themen