2

我有一个调用 C++ .Net 类库的 C# .Net 控制台应用程序。但是,当执行以下应用程序时,列表变为空!!!

如果我删除旁边注释中指示的行,则代码有效。我不明白这是为什么。

如果我想按照下面的尝试为 C++ 类库中的列表重新分配内存,那么正确的方法是什么?

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

请注意,“列表”是通过引用传递的,因此当您分配一个新对象时,它将更改传递给函数的原始变量。

等效的 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 回答