.net unterschied Wie deklariere und rufe ich in C++/CLI eine Funktion mit einem Parameter 'out' auf?




out ref parameter (3)

Mit Visual Studio 2008 funktioniert das und löste ein großes Problem in meinem Job. Vielen Dank!

// header
// Use namespace for Out-attribute.
using namespace System::Runtime::InteropServices; 
namespace VHT_QMCLInterface {
   public ref class Client
   {
    public:
        Client();
        void ReturnInteger( int a, int b, [Out]int %c);
        void ReturnString( int a, int b, [Out]String^ %c);
   }
}

// cpp
namespace VHT_QMCLInterface {

    Client::Client()
    {

    }

    void Client::ReturnInteger( int a, int b, [Out]int %c)
    {
        c = a + b;
    }
    void Client::ReturnString( int a, int b, [Out]String^ %c)
    {
        c = String::Format( "{0}", a + b);
    }
}

// cs
namespace TestQMCLInterface
{
    class Program
    {
        VHT_QMCLInterface.Client m_Client = new VHT_QMCLInterface.Client();
        static void Main(string[] args)
        {
            Program l_Program = new Program();
            l_Program.DoReturnInt();
            l_Program.DoReturnString();
            Console.ReadKey();
        }

        void DoReturnInt()
        {
            int x = 10;
            int y = 20;
            int z = 0;
            m_Client.ReturnInteger( x, y, out z);
            Console.WriteLine("\nReturnInteger: {0} + {1} = {2}", x, y, z);
        }

        void DoReturnString()
        {
            int x = 10;
            int y = 20;
            String z = "xxxx";
            m_Client.ReturnString(x, y, out z);
            Console.WriteLine("\nReturnString: {0} + {1} = '{2}'", x, y, z);
        }
     }
}

Ich habe eine Funktion, die einen String in zwei Strings parst. In C # würde ich es so erklären:

void ParseQuery(string toParse, out string search, out string sort)
{
    ...
}

und ich würde es so nennen:

string searchOutput, sortOutput;
ParseQuery(userInput, out searchOutput, out sortOutput);

Das aktuelle Projekt muss in C ++ / CLI durchgeführt werden. ich habe es versucht

using System::Runtime::InteropServices;

...

void ParseQuery(String ^ toParse, [Out] String^ search, [Out] String^ sort)
{
    ...
}

aber wenn ich es so nenne:

String ^ searchOutput, ^ sortOutput;
ParseQuery(userInput, [Out] searchOutput, [Out] sortOutput);

Ich bekomme einen Compilerfehler, und wenn ich es so nenne:

String ^ searchOutput, ^ sortOutput;
ParseQuery(userInput, searchOutput, sortOutput);

dann bekomme ich einen Fehler zur Laufzeit. Wie soll ich meine Funktion deklarieren und aufrufen?


Es wird nicht unterstützt. Der nächste, den Sie bekommen können, ist Ref

Zugegeben, Sie können es fälschen, aber Sie verlieren eine Kompilierzeitprüfung.


C ++ / CLI selbst unterstützt kein echtes "out" -Argument, aber Sie können eine Referenz als out-Argument markieren, damit andere Sprachen es als reales Argument betrachten.

Sie können dies für Referenztypen wie folgt tun:

void ReturnString([Out] String^% value)
{
   value = "Returned via out parameter";
}

// Called as
String^ result;
ReturnString(result);

Und für Werttypen wie:

void ReturnInt([Out] int% value)
{
   value = 32;
}

// Called as
int result;
ReturnInt(result);

Das% macht es zu einem ref-Parameter, und das OutAttribute markiert, dass es nur für Ausgabewerte verwendet wird.







pass-by-reference