Я могу разоблачить некоторые методы в библиотеке 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
.
Я думаю, что вы должны сериализовать массив первым и следующим десериализатором – pedrofernandes
@ pho3nix Вы правы. По крайней мере, если вы игнорируете всех C++/CLI featuers и не знаете, что предлагает язык. В противном случае вы полностью делаете ненужные вещи. БОЛЬШОЕ программирование. – TomTom
Вы не можете использовать std :: vector, компилятор слишком стар. Управление памятью также является проблемой по той же причине, поэтому распределение массива с помощью * new * также невозможно. Используйте LocalAlloc() или SafeArrayCreate(), чтобы добраться куда-нибудь. –