2009-12-02 3 views
2

У меня есть консольное приложение C# .Net, которое вызывает библиотеку классов C++ .Net. Однако, когда выполняется следующее приложение, список становится пустым !!!Управляемый C++: строки в списке не передаются обратно вызывающему абоненту

Если я удаляю строку, указанную в комментарии рядом с ней, код работает. Я не понимаю причину этого.

Если я хочу перераспределить память для списка в библиотеке классов 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")); 
} 

ответ

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

+0

@Smirnov: Он работает сейчас. Большое спасибо! :) –

+0

@Smirnov: C# также может использовать ключевое слово «out». Есть ли эквивалент в C++/CLI? –

+0

Если вы установите для него атрибут [Out], он будет идентичен ключевому слову «out», например. void Callee :: DoSomething ([Out] List ^% list) – Smirnov

Смежные вопросы