Да. Вы можете. На самом деле, не только std::string
, std::wstring
, любой стандартный класс C ++ или ваши собственные классы можно маршалировать или создавать и вызывать из C # /. NET.
Основная идея создания объекта 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)
Если у вас есть готовый класс-оболочка C # для вашего класса C ++, можно легко реализовать ICustomMarshaler
, чтобы вы могли маршалировать объект C ++ из .NET.
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.icustommarshaler.aspx