2010-12-27 19 views

Respuesta

3

Si puede modificar el dll de C++, exporte una versión de cadena simple. De lo contrario, debe compilar un proyecto de contenedor de C++ administrado, importar el otro dll de C++, exportarlo como una función administrada y llamarlo desde su código de C#. La interoperabilidad de C++ realmente apesta.

3

Me temo que tendrá que crear su propia clase StringStream en C# para poder consumir las funciones exportadas desde esa DLL. Como mencionó, .NET Framework no proporciona ninguna clase similar de la caja.

La manera más fácil es probablemente ajustar la clase StringBuilder proporcionada por .NET Framework de modo que pueda funcionar como una secuencia. Consulte this blog post para obtener una explicación más detallada y algunos ejemplos de código.

Una pregunta similar también fue respondida en la Revista de MSDN: http://msdn.microsoft.com/en-us/magazine/cc163768.aspx. Es posible que encuentre útiles algunos de los consejos y/o códigos de muestra que se ofrecen allí.

11

No debe exponer objetos con plantilla a través de una DLL, punto.

Los objetos con plantilla (por ejemplo, casi todo en std::) se incrustan. Entonces, de esta manera, su DLL obtiene su propia copia privada de la implementación. El módulo que llama a su DLL también obtendrá su propia implementación privada de stringstream. Pasar entre ellos significa que está tejiendo inadvertidamente dos implementaciones no relacionadas entre sí. Para muchos proyectos, si usa la misma configuración de compilación, probablemente no sea un problema.

Pero incluso si usa el mismo compilador y mezcla una versión DLL con un debug EXE, encontrará corrupción de pila/montón y otros problemas más difíciles de encontrar.

Y eso solo está usando su DLL desde otro exe/dll de C++ no administrado. Cruzar luego las líneas a .NET es aún más un problema.

La solución consiste en cambiar la interfaz de su DLL a algo que sea compatible con los límites de DLL. O bien COM (puede usar IStream por ejemplo), o simplemente una interfaz estilo C como el winapi.

+0

I intentado importar una función en no administrado C++ que toma std: cadena como parámetro en el programa C# y tiene el siguiente error en tiempo de ejecución: "Excepción no controlada: System.AccessViolationException: Intentó memoria protegida de lectura o escritura. Esto a menudo indica que otra memoria está dañada. en Win32API.processRequestWithStream (String & inputString, String & outputString) en Win32API.Main() "- ¿Cuál podría ser la causa de este error? – user186246

+1

'std :: string' es un' typedef' de 'std :: basic_string ', es decir, tiene la misma plantilla que 'stringstream'. –

+1

¿Y los diversos indicadores inteligentes?Si tomo esto literalmente, esto significa que no se debe exponer C++ no trivial a través de los límites de DLL. –

0

Está intentando vincular el código nativo de C++ al código administrado en C#. La mejor manera de hacerlo en general es introducir una capa intermedia en C++ administrado que proporcionará una interfaz para las llamadas desde C#.

0

Cree un dll Wrapper en c, o C++ que expone una llamada amistosa a esa función. Es la mejor manera.

por ejemplo un

BOOL getString(TCHAR * myreturnString, DWORD *size); 
Cuestiones relacionadas