He creado una DLL en C#. Ahora quiero usar el R Environment para llamar funciones en esa DLL. El entorno R admite la invocación de DLL de C/C++ no administradas, pero no a las DLL de .NET. Entonces mi pregunta es, ¿puedo llamar funciones en una DLL C# desde una DLL C/C++? Si es así, ¿tiene un enlace a información sobre cómo hacer esto?¿Puedes llamar a una DLL de C desde una DLL de C?
Respuesta
La forma más sencilla de hacer esto es exponer una de las clases C# en su C# DLL como un objeto COM, y luego crear una instancia de la misma desde su C/C++ DLL. Si esa no es una opción aceptable, deberá crear una DLL de C++ en modo mixto (que contenga tanto código administrado como no administrado). Su DLL C/C++ puede llamar a las funciones exportadas en su DLL de modo mixto, que a su vez puede reenviar las llamadas a su clase C#.
Este artículo podría ayudarle a cabo:
Actualizado: Hay una herramienta llamada mergebin que se incluye con el .NET SQLite wrapper se puede utilizar para crear un/DLL administrada de modo mixto nativa. Coge el código fuente a partir de:
SQLite for ADO.NET 2.0 (SourceForge)
Encontrará el exe en la carpeta bin\tools
.
Kev
Gracias por el enlace Kev - lectura interesante. – Guy
En realidad es bastante fácil. Simplemente use NuGet para agregar el paquete "UnmanagedExports" a su proyecto .Net. Vea https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports para más detalles.
Puede exportar directamente, sin tener que hacer una capa COM. Aquí está la muestra de código C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using RGiesecke.DllExport;
class Test
{
[DllExport("add", CallingConvention = CallingConvention.Cdecl)]
public static int TestExport(int left, int right)
{
return left + right;
}
}
R debe ser capaz de cargar TextExport al igual que un archivo DLL estándar C.
- 1. Llamar a C# dll desde Delphi
- 2. Llamar a una función delphi DLL desde C# Code
- 3. Llamar a C++ DLL de Python
- 4. Referencia a una DLL desde otra DLL
- 5. Cómo llamar a la función DLL de C# desde VBScript
- 6. ¿Puede una DLL llamar a una DLL .NET?
- 7. Cómo llamar a una DLL .NET desde un proceso Win32?
- 8. Llamar a una DLL de Delphi desde una aplicación de C# .NET
- 9. Llamar a un método delphi DLL desde C# Code
- 10. System.AccessViolationException al llamar a C++ dll
- 11. DLL de llamada C desde C#
- 12. Importación dinámica de una clase de C++ desde una DLL
- 13. ¿Puedes llamar a una función C# desde JavaScript?
- 14. Llamando a C# dll desde Java
- 15. Llamar a los métodos DLL desde Javascript
- 16. Exportación de una función C nativa desde una DLL .net?
- 17. Llamando a C++ dll desde Java
- 18. ¿Cómo puedo llamar a una función de una DLL C++ que acepta un parámetro de tipo stringstream desde C#?
- 19. Llamar a una DLL de Delphi desde C# produce resultados inesperados
- 20. ¿Cómo exportar una clase de C++ desde un dll?
- 21. Pase cadena de C# a C DLL
- 22. ¿Es posible llamar a una DLL administrada desde C++ no administrado?
- 23. Pasando una cadena de C# a una DLL de C no administrada en Windows Mobile
- 24. Importar una DLL con C++ (Win32)
- 25. Haciendo DLL Fortran y llamarlo desde C#
- 26. ¿Cómo puedo llamar a una DLL .NET desde una secuencia de comandos Inno Setup?
- 27. Carga dinámicamente una función desde una DLL
- 28. Hacer una DLL de un proyecto C#?
- 29. Exportación de funciones de C++ dll a C# P/Invoke
- 30. Obteniendo el nombre de una DLL desde el dll
Ese modo mixto de C++ DLL suena como si fuera el truco. Acabo de echar un vistazo a las plantillas disponibles para crear un proyecto de DLL de modo mixto usando VS2008 pero no veo una. ¿Cómo vas a comenzar con una DLL de modo mixto? – Guy
Si crea una nueva biblioteca de clases de C++, crea un proyecto DLL de C++. Siempre que la configuración "Common Language Runtime support" esté configurada en "Common Language Runtime support (/ clr)", puede usar tanto código administrado como no administrado en el proyecto. – Andy