Ho un'applicazione legacy scritta in C, e vorrei spostare gradualmente del codice in C#. Ma prima di essere in grado di riscrivere tutto, sarà necessario avere solo pochi componenti scritti in C# che saranno usati da C.Come riutilizzare un assembly .Net da un'applicazione C pura
risposta
Immagino che la tua classe C# sia una classe statica. È necessario creare un livello di interoperabilità in C++/CLI prima di poterlo utilizzare in puro C. Creare una classe C++/CLI per avvolgere la classe C#. Fatto ciò, utilizzare la funzione di esportazione per esportare le funzioni specifiche C. C++/CLI gestirà l'interoperabilità per tuo conto. La regola generale è se la classe/funzione ha una CLI che sarà CLI. Quindi le tue funzioni esterne dovrebbero restituire solo tipi di dati nativi.
extern "C" __declspec(dllexport) int MyFunc(long parm1);
Ecco un articolo per aiutarti a iniziare. Converte C++ in C# ma il processo è invertito nel tuo caso. CodeProject Sfortunatamente non vi è alcuna inversione conveniente PInvoke per puro C.
Purtroppo non sono mai andato da C# a C. Sembra un progetto interessante. In bocca al lupo!
Ok Se non l'hai ancora capito, ho un campione veloce per te.
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++ Progetto CPPCLibrary.h (compilato con C++/CLI Opzione con dipendenze di progetto)
#pragma once
using namespace System;
extern "C" __declspec(dllexport) int MathAdd(int a, int b)
{
return CSLibrary::Math::Add(a, b);
}
C Progetto CTest .c (Compilato come codice 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;
}
Tutti i file si trovano nella stessa soluzione ma in progetti diversi. Ho confermato che ha funzionato. Spero che questo aiuti chiunque lo trovi.
Cheers!
Se il codice è C puro, potresti essere in grado di inserirlo in un C++ visuale progetto di assemblaggio senza troppe difficoltà. Da lì, avresti accesso a una normale .net api.
- 1. .NET Assembly Dipendenze
- 2. Caricamento assembly WinRT da .NET
- 3. Come registrare un assembly .NET come COM?
- 4. Eseguire un assembly .exe da un buffer in C
- 5. .NET Assembly Culture
- 6. Riutilizzare un vettore in C++
- 7. È possibile fare riferimento a un assembly .NET da ColdFusion?
- 8. Estrazione di un assembly .NET da SQL Server 2005
- 9. .NET: accesso a membri non pubblici da un assembly dinamico
- 10. Chiamata di .NET dll da C++ nativo
- 11. WinSCP .NET assembly: Come scaricare le directory
- 12. .NET Module vs Assembly
- 13. È possibile eseguire un assembly .NET (dll) da vbscript?
- 14. .net 4 parziale considera un assembly da GAC
- 15. Firma di assembly .NET
- 16. Confronta 2 versioni di un assembly .NET?
- 17. Sicurezza plug-in .NET Assembly
- 18. Prestazioni cross-assembly .NET Hit
- 19. C# Load Sandboxed Assembly
- 20. Prestazioni di .NET ILMerged assembly
- 21. Come riutilizzare un ostringstream?
- 22. Come posso leggere le informazioni sulla firma digitale da un assembly .Net firmato?
- 23. Carica un ResourceDictionary da un assembly
- 24. Come leggere app.config da un altro assembly?
- 25. Come posso estrarre immagini dal file .resources creato da un decompilatore di un assembly .NET?
- 26. Chiamare funzioni C da linguaggio assembly x86
- 27. Quando si collega un assembly gestito .NET 2.0 da un'applicazione .NET 4.0, quale framework viene utilizzato?
- 28. Gli assembly .NET cambiano mai?
- 29. Come ottenere la data di un assembly .NET
- 30. Come sapere se un assembly .NET è dinamico?
Se avrò un po 'di tempo mi piacerebbe creare una piccola demo. Sembra divertente. –