Завершение std::vector<your_struct>
в C # возможно только с обычным P / Invoke Interop, хотя это сложно.
Основная идея создания экземпляра объекта C ++ из мира .NET состоит в том, чтобы выделить точный размер объекта C ++ из .NET, затем вызвать конструктор, который экспортируется из DLL C ++, для инициализации объекта, а затем выиметь возможность вызывать любую из функций для доступа к этому объекту C ++, если какой-либо из методов включает другие классы C ++, вам потребуется также обернуть их в класс C #, для методов с примитивными типами вы можете просто P / Invoke их,Если у вас есть только несколько методов для вызова, это будет просто, ручное кодирование не займет много времени.Когда вы закончите работу с объектом C ++, вы вызываете метод деструктора объекта C ++, который также является функцией экспорта.если у него его нет, вам просто нужно освободить память из .NET.
Вот пример.
public class SampleClass : IDisposable
{
[DllImport("YourDll.dll", EntryPoint="ConstructorOfYourClass", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.ThisCall)]
public extern static void SampleClassConstructor(IntPtr thisObject);
[DllImport("YourDll.dll", EntryPoint="DoSomething", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.ThisCall)]
public extern static void DoSomething(IntPtr thisObject);
[DllImport("YourDll.dll", EntryPoint="DoSomethingElse", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.ThisCall)]
public extern static void DoSomething(IntPtr thisObject, int x);
IntPtr ptr;
public SampleClass(int sizeOfYourCppClass)
{
this.ptr = Marshal.AllocHGlobal(sizeOfYourCppClass);
SampleClassConstructor(this.ptr);
}
public void DoSomething()
{
DoSomething(this.ptr);
}
public void DoSomethingElse(int x)
{
DoSomethingElse(this.ptr, x);
}
public void Dispose()
{
Marshal.FreeHGlobal(this.ptr);
}
}
Подробнее см. по ссылке ниже,
C # /. NET PInvoke Interop SDK
(я являюсь автором инструмента SDK)