Ich musste gerade ein bisserl herumknobeln, wie man in C++/CLI einen Methodenparameter so markiert, dass er in anderen .NET-Sprachen, in meinem Fall C#, als “out” oder “ref” gekenzeichnet wird.
Möchte man nur einen klassischen ‘call by reference’-Fall erreichen, hier also einen Parameter, der sowohl Eingabe, als auch Ausgabewert sein kann, muss man ihn als “tracking reference” markieren. Am Beispiel String^:
public ref class Foo {
public:
// c#: void Bar( ref String woo )
void Bar( String^% woo );
}
-
public ref class Foo {
-
public:
-
// c#: void Bar( ref String woo )
-
void Bar( String^% woo );
-
}
Die entsprechende Signatur in C# wäre dann void Bar( ref String woo ).
Möchte man nun einen Parameter explizit als “out”, also ausschließlich zur Ausgabe, markieren, benötigt man zusätzlich das Attribut [Out] – dieses befindet sich allerdings freundlicherweise im Namespace
System::Runtime::InteropServices
vergraben.
Also
using namespace System::Runtime::InteropServices;
public ref class Foo {
public:
// c#: void Bar( out String woo )
void Bar( [Out] String^% woo );
}
-
using namespace System::Runtime::InteropServices;
-
-
public ref class Foo {
-
public:
-
// c#: void Bar( out String woo )
-
void Bar( [Out] String^% woo );
-
}
Und alles ist, wie es sein soll. Falls man dennoch eine Fehlermeldung wie (C3763)
'retval' and 'out' can only appear on a data-pointer type
erhält, hat man “Out” ganz simpel – und falsch – in Kleinbuchstaben (“out”) geschrieben.