2016-05-23 2 views
0

Я могу разоблачить некоторые методы в библиотеке C#, чтобы их можно было использовать из внешней программы, написанной на C++ (VC++ 6.0). Таким образом, я создал смешанную сборку, которая работает довольно хорошо, но у меня есть некоторые проблемы с методом, который возвращает массив объектов .NET.Pass C# массив объекта для C++/CLI

.NET подпись метода:

public Results[] Measure(String model, String identifier); 

Где Results сама по себе:

public class Results 
{ 
    public String[] ElementType; 
    public bool[] HasError; 
} 

Чтобы обеспечить точку входа от C++, я начал писать C++/CLI метод обертывания следующим образом:

std::vector<ResultsWrapper> Measure(char* model, char* identifier) 
{ 
    // Call .NET code 
    String^ gcmodel = gcnew System::String(model); 
    String^ gcidentifier = gcnew System::String(identifier); 
    cli::array<Results^>^ gcres = myNetInstance->Measure(gcmodel, gcidentifier); 

    // Convert results to C++ vector 
    std::vector<ResultsWrapper> ret; 
    for (int ki = 0; ki < res->Length; ki++) 
    { 
     ResultsWrapper r = ResultsWrapper(res[ki]->....,); 
     ret.push_back(r); 
    } 

    return ret; 
} 

но я должен признать, что я немного потерял, это очень долгое время, я не написал ни одной строки C++ и очень долгое время не имел дело с от руки управление памятью ...

Какое оптимальное решение для создания класса ResultsWrapper, чтобы не было необходимости заботиться об управлении памятью со стороны C++. Может быть, что-то вроде следующего?

class ResultsWrapper 
{ 
    public: 
     ResultsWrapper(vector<std::String> elementType, vector<bool> hasError) 
     { 
     this.ElementType = elementType; 
     this.HasError = hasError; 
     } 

    public: 
    vector<std:String> ElementType; 
    vector<bool> HasError; 
} 

NB: Я не думаю, что команда на VC++ 6.0 стороны знают о библиотеке повышающего или share_ptr типов (и я не очень знающие о них тоже). Весь код на C++ - это очень классический стиль кода на C++, даже не используя stdlib.

+0

Я думаю, что вы должны сериализовать массив первым и следующим десериализатором – pedrofernandes

+0

@ pho3nix Вы правы. По крайней мере, если вы игнорируете всех C++/CLI featuers и не знаете, что предлагает язык. В противном случае вы полностью делаете ненужные вещи. БОЛЬШОЕ программирование. – TomTom

+2

Вы не можете использовать std :: vector, компилятор слишком стар. Управление памятью также является проблемой по той же причине, поэтому распределение массива с помощью * new * также невозможно. Используйте LocalAlloc() или SafeArrayCreate(), чтобы добраться куда-нибудь. –

ответ

0

я не мог пройти безопасно/легко типов STL через границы DLL, так что я вернусь к старой char**, и ручное распределение/открепление и он просто работал ...

IJW некоторое время только ... тогда я попытался проверить, когда бросает исключение из .NET обратно в вызывающее приложение C++, а затем patatra ... нужно преобразование в собственные исключения ... что снова не может безопасно пересечь границы dll ...

Собрания смешанного режима звучат привлекательно, чтобы перейти от .NET к родному, но это был опыт IJS в моем случае ... Я сдаюсь и буду проходить через COM.

0

В C++/CLI, я начал писать метод обертку, как это:

Нет, вы не

общественные результаты [] Мера (String модель, идентификатор строки);

не имеет никакого сходства в

станд :: векторная мера (символ * модели, символ * идентификатор)

None.

В ссылочном классе C++/CLI не требуется сортировка. Используйте String^как указатель o string (вместо char *) и используйте массив^как указатель на управляемый массив.

Нет необходимости использовать обертку вообще. Объявите класс как управляемый refernce (ref class), и вы можете вызвать его с .NET, потому что это .NET CLASS.

+3

Ух ты, похоже, злишься. –

+1

Сдвиг не мой, я только низкую технически неверные ответы. Твоя правда, хотя я только хотел намекнуть, что ты должен следить за своим тоном. И не сердитесь на меня, я знаю тему довольно хорошо :) –

+0

Yup. C++/CLI определенно заслуживает больше любви от MS - документы являются тайными, вы получаете все причуды C++, причуды .NET и причудливое поведение, возникающее из-за попытки объединить эти два. Это рецепт головной боли. Но ваше право на части RTFM - 3/4 вопросов в этом теге - это строковое маршалинг: - \ –