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.
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)
vez que tenga el # clase de contenedor C de C++ clase preparada, es fácil implementar ICustomMarshaler
para que pueda ordenar el objeto C++ de .NET.
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.icustommarshaler.aspx
Gran pregunta; Me sorprendió que no funcione automágicamente. http://msdn.microsoft.com/en-us/library/1b4az623.aspx –
Me sorprendió demasiado ... no hay una razón importante por la que no debería ... pero parece que STL no va a funcionar con eso ... Además ... Simplemente cambiaría la función para usar WCHAR, pero no es una DLL que pueda cambiar. –