Quiero importar una DLL de C++ no administrada y llamar a una función que toma stringstream
como parámetro. En C#, no hay clase stringstream
, así que ¿alguien puede decirme cómo llamar a dicha función desde un programa C#?¿Cómo puedo llamar a una función de una DLL C++ que acepta un parámetro de tipo stringstream desde C#?
Respuesta
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.
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í.
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.
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#.
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);
- 1. Llamar a una función delphi DLL desde C# Code
- 2. Cómo llamar a la función DLL de C# desde VBScript
- 3. cómo llamar a una función C desde C# con un parámetro WCHAR * out?
- 4. ¿Puedes llamar a una DLL de C desde una DLL de C?
- 5. Llamar a una función MATLAB desde C#
- 6. ¿Cómo puedo llamar a una función de SQL en C#?
- 7. ¿Cómo puedo llamar a una función que devuelve una tabla y acepta un varchar?
- 8. WebKit.NET para llamar a una función de C# desde JavaScript
- 9. ¿Cómo pasaría una función de delegado de C# a un .Dll administrado de C++?
- 10. Exportación de una función C nativa desde una DLL .net?
- 11. Llamar a C# dll desde Delphi
- 12. Cómo llamar a una DLL .NET desde un proceso Win32?
- 13. ¿Cómo puedo escribir una función C genérica para llamar a una función Win32?
- 14. Llamar a un método delphi DLL desde C# Code
- 15. Cómo llamar a una función de Oracle con un Cursor de Ref como parámetro de Salida desde C#?
- 16. ¿Cómo puedo llamar a una DLL .NET desde una secuencia de comandos Inno Setup?
- 17. ¿Cómo puedo llamar a C++/CLI desde C#?
- 18. Llamar a una función .dll desde una página html que se ejecuta en cromo y firefox
- 19. ¿Puedes llamar a una función C# desde JavaScript?
- 20. Volver stringstream de una función
- 21. Problema con llamar a una función PowerShell desde C#
- 22. No se puede llamar a un método de Objective C desde una función C
- 23. Cómo escribo una función jquery que acepta una devolución de llamada como un parámetro
- 24. Llamada a la función delphi dll desde C# que pasa en una matriz de bytes
- 25. ¿Cómo obtengo una descripción de error std :: exception cuando llamo a un dll C++ desde C#
- 26. Carga dinámicamente una función desde una DLL
- 27. Llamar a una DLL de Delphi desde una aplicación de C# .NET
- 28. Cómo puedo llamar a las funciones de C++ desde ruby
- 29. Llamar a C++ DLL de Python
- 30. C# - ¿Cómo puedo pasar una referencia a una función que requiere una variable de salida?
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
'std :: string' es un' typedef' de 'std :: basic_string', es decir, tiene la misma plantilla que 'stringstream'. –
¿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. –