49

1 つの文字列を 2 つの文字列に解析する関数があります。C# では、次のように宣言します。

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

そして、私はそれを次のように呼びます:

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

現在のプロジェクトは C++/CLI で行う必要があります。私はもう試した

using System::Runtime::InteropServices;

...

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

しかし、次のように呼び出すと:

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

コンパイラ エラーが発生します。次のように呼び出すと、次のようになります。

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

その後、実行時にエラーが発生します。関数をどのように宣言して呼び出す必要がありますか?

4

3 に答える 3

86

C++/CLI 自体は実際の 'out' 引数をサポートしていませんが、参照を out 引数としてマークして、他の言語がそれを実際の out 引数として認識できるようにすることができます。

これは、参照型に対して次のように行うことができます。

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

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

また、値の型については次のとおりです。

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

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

% はそれを 'ref' パラメーターにし、OutAttribute はそれが出力値にのみ使用されることを示します。

于 2008-10-09T14:43:27.603 に答える
10

Visual Studio 2008 を使用すると、これが機能し、私の仕事での大きな問題が解決されました。ありがとう!

// 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);
        }
     }
}
于 2010-05-25T21:28:49.810 に答える
-2

サポートされていません。あなたが得ることができる最も近いものはrefです

あなたはそれを偽造することができますが、コンパイル時のチェックを失います。

于 2008-10-09T09:18:49.930 に答える