Tengo una aplicación heredada escrita en C, y me gustaría mover gradualmente algún código a C#. Pero antes de poder reescribir todo necesitaré tener solo unos pocos componentes escritos en C# primero que van a ser utilizados desde C.Cómo reutilizar un ensamblado .Net desde una aplicación C pura
Respuesta
Supongo que su clase C# es una clase estática. Necesita crear una capa de interoperabilidad en C++/CLI antes de poder usarla en puro C. Cree una clase C++/CLI para ajustar su clase C#. Una vez hecho esto, use la función exportar para exportar las funciones específicas C. C++/CLI administrará la interoperabilidad en su nombre. La regla de oro es que si su clase/función tiene alguna CLI, SERÁ CLI. Por lo tanto, sus funciones externas solo deberían devolver tipos de datos nativos.
extern "C" __declspec(dllexport) int MyFunc(long parm1);
Aquí hay un artículo para ayudarlo a comenzar. Convierte C++ en C# pero el proceso se invierte en su caso. CodeProject Desafortunadamente no existe un reverso conveniente PInvoke para puro C.
Lamentablemente, nunca he pasado de C# a C. Parece un proyecto interesante. ¡Buena suerte!
Ok Si aún no lo has descubierto, tengo una muestra rápida para ti.
C# CSLibrary.Math.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CSLibrary
{
static public class Math
{
static public int Add(int a, int b)
{
int c = a + b;
return c;
}
}
}
CPP/C++ Proyecto CPPCLibrary.h (compilados con la opción C++/CLI con las dependencias del proyecto)
#pragma once
using namespace System;
extern "C" __declspec(dllexport) int MathAdd(int a, int b)
{
return CSLibrary::Math::Add(a, b);
}
C Proyecto CTest .c (compilado como código C)
#include "stdafx.h"
#pragma comment(lib, "../Debug/CPPCLILibrary.lib")
extern __declspec(dllimport) int MathAdd(int a, int b);
int _tmain(int argc, _TCHAR* argv[])
{
int answer = MathAdd(10, 32);
_tprintf(_T("%d\n"), answer);
return 0;
}
Todos los archivos tienen la misma solución pero diferentes proyectos. Confirmé que esto funcionó. Espero que esto ayude a cualquiera que se encuentre con esto.
¡Salud!
Si el código es puro C, podrías ponerlo en un C++ visual proyecto de montaje sin demasiada dificultad. Desde allí, tendrías acceso a una API regular .net.
- 1. ¿Cómo puedo llamar a un ensamblado de .NET desde C/C++?
- 2. ¿Cómo puedo depurar un ensamblado C# COM cuando se llama desde una aplicación nativa win32?
- 3. Cargando el ensamblado WinRT desde .NET
- 4. Exportación de una función C nativa desde una DLL .net?
- 5. ¿Cómo registrar un ensamblado .NET como COM?
- 6. ¿Cómo creo un ensamblado .NET en IronPython y lo llamo desde C#?
- 7. Depuración de un ensamblado .NET generado desde dentro de la aplicación que lo generó
- 8. Cargar un ensamblado desde un recurso incrustado
- 9. ¿Puedo ejecutar un ensamblado C# (dll) como 32 bits desde una aplicación de 64 bits?
- 10. Cargando un ensamblado para .NET 4.5 en un dominio de aplicación .NET 4.0
- 11. ¿Es posible ejecutar un ensamblado .NET (dll) desde vbscript?
- 12. ¿Es posible desactivar la reflexión desde un ensamblado .NET?
- 13. Llamar al ensamblado de .NET desde Java: bloqueos de JVM
- 14. Obteniendo la fecha de un ensamblado .NET
- 15. ¿Cómo incrustar un archivo de texto en un ensamblado .NET?
- 16. Al vincular un .NET 2.0 Managed Assembly desde una aplicación .NET 4.0, ¿qué marco se utiliza?
- 17. Reiniciar Windows desde una aplicación .NET
- 18. ¿Cómo puedo detectar si mi ensamblado .NET se está ejecutando desde un sitio web o desde una máquina de escritorio?
- 19. llamando a funciones de ensamblado desde c
- 20. ¿Cómo reutilizar el socket en .NET?
- 21. Ejecutar un comando de shell desde una aplicación .NET
- 22. ¿Cómo reutilizar un ostringstream?
- 23. ¿Comparar 2 versiones de un ensamblado .NET?
- 24. ¿Cómo agrego un ensamblado .NET al GAC en InnoSetup?
- 25. Cómo enviar contenido desde otro ensamblado
- 26. Buscando el ensamblado .NET en un lugar diferente
- 27. ¿Cómo usar el ensamblado .Net de Win32 sin registro?
- 28. ¿Se puede llamar a un objeto COM .NET 2.0 desde una aplicación web ASP.NET 1.1?
- 29. ¿Resolviendo una referencia de ensamblado .NET a un nombre diferente?
- 30. Cómo descargar una referencia de ensamblado .NET en IronPython
Si tengo algo de tiempo, me gustaría crear una pequeña demostración. Esto suena divertido. –