Sí. Usted puede. En realidad, no solo std::string
, std::wstring
, cualquier clase estándar de C++ o sus propias clases se pueden calcular o instanciar y llamar desde C# /. NET.
Envasar un std::vector<any_type>
en C# es de hecho posible con solo P/Invoke Interop, aunque es complicado. incluso un std::map
de cualquier tipo se puede hacer en C# /. NET.
La idea básica de instanciar un objeto C++ del mundo .NET es asignar el tamaño exacto del objeto C++ de .NET, luego llamar al constructor que se exporta desde la DLL C++ para inicializar el objeto, entonces podrá para llamar a cualquiera de las funciones para acceder a ese objeto C++, si alguno de los métodos involucra otras clases de C++, también deberá envolverlos en una clase C#, para los métodos con tipos primitivos, simplemente puede P/invocarlos. Si solo tiene unos pocos métodos para llamar, sería simple, la codificación manual no tomará mucho tiempo. Cuando haya terminado con el objeto C++, llame al método destructor del objeto C++, que también es una función de exportación. si no tiene uno, solo necesita liberar su memoria de .NET.
Aquí hay un ejemplo.
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);
}
}
Para los detalles, consulte el siguiente enlace,
C#/.NET PInvoke Interop SDK
(yo soy el autor de la herramienta SDK)
Lo siento. Cambiaré mi respuesta. Por favor, no vote abajo una respuesta correcta. – xInterop
No hay problema. Yo los cambiaré a todos. ¡Gracias! – xInterop
¡Gracias por las actualizaciones de todas sus respuestas! – Jesse