2

C++ .Net クラス ライブラリを呼び出す C# .Net コンソール アプリケーションがあります。ただし、次のアプリケーションを実行すると、リストが空になります!!!

横のコメントに示されているように行を削除すると、コードは機能します。この理由がわかりません。

以下でやろうとしているように、C++ クラス ライブラリの list のメモリを再割り当てしたい場合、正しい方法は何ですか?

C#2005 コンソール アプリケーション

class Caller
{
    static void Main(string[] args)
    {
        Callee callee = new Callee();
        List<String> s = new List<String>();
        callee.DoSomething(s);

        Console.WriteLine(s.Count); // Prints out 0
    }
}

C++2005 クラス ライブラリ

public ref class Callee
{
    public:
    void DoSomething(List<String^>^ list);
};

void Callee::DoSomething(List<String^>^ list)
{
    list = gcnew List<String^>(); // Remove this line and it works
    list->Add(gcnew String("Test String 1"));
    list->Add(gcnew String("Test String 2"));
}
4

1 に答える 1

1

C ++ / CLIでこれと同等のものが必要です(C#コードが続きます)

class Caller
{
    static void Main(string[] args)
    {
        Callee callee = new Callee();
        List<String> s = new List<String>();
        callee.DoSomething(ref s);

        Console.WriteLine(s.Count); // Prints out 0
    }
}

public class Callee 
{
    void DoSomething(ref List<string> list)
    {
        list = new List<string>(); 
        list.Add("Test String 1");
        list.Add("Test String 2");
    }
}

'list'は参照によって渡されるため、新しいオブジェクトを割り当てると、関数に渡されていた元の変数が変更されることに注意してください。

同等のC++/CLI構文は次のとおりです。

public ref class Callee
{
    public:
    void DoSomething(List<String^>^% list);
};

void Callee::DoSomething(List<String^>^% list)
{
    list = gcnew List<String^>(); 
    list->Add(gcnew String("Test String 1"));
    list->Add(gcnew String("Test String 2"));
}

そこにあるタイプに「%」を追加すると、リストが追跡参照として渡されます。

参照の追跡の詳細については、http://en.wikipedia.org/wiki/C%2B%2B/CLI#Tracking_referencesを参照してください。

于 2009-12-02T05:35:04.337 に答える