Ich habe eine Legacy-Anwendung in C geschrieben, und ich möchte schrittweise Code nach C# verschieben. Aber bevor ich alles neu schreiben kann, brauche ich nur einige Komponenten, die in C# geschrieben werden, die von C verwendet werden.Wie Sie eine .Net-Assembly aus einer reinen C-Anwendung wiederverwenden
Antwort
Ich nehme an, dass Ihre C# Klasse eine statische Klasse ist. Sie müssen eine Interop-Schicht in C++/CLI erstellen, bevor Sie sie in reinem C verwenden können. Erstellen Sie eine C++/CLI Klasse, um Ihre C# Klasse zu verpacken. Sobald dies erledigt ist, verwenden Sie die Exportfunktion, um die spezifischen C Funktionen zu exportieren. C++/CLI wird die Interop in Ihrem Namen verwalten. Die Faustregel ist, wenn Sie CLI haben, wird CLI CLI sein. Ihre externen Funktionen sollten also nur native Datentypen zurückgeben.
extern "C" __declspec(dllexport) int MyFunc(long parm1);
Hier ist ein Artikel, um Ihnen den Einstieg zu erleichtern. Es konvertiert C++ zu C# aber der Prozess ist in Ihrem Fall umgekehrt. CodeProject Leider gibt es keine bequeme umgekehrte PInvoke für reine C.
Leider bin ich nie von C# zu C gegangen. Es klingt wie ein interessantes Projekt. Viel Glück!
Ok Wenn Sie es noch nicht herausgefunden haben, habe ich eine schnelle Probe für Sie.
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++ Projekt CPPCLibrary.h (Zusammengestellt mit C++/CLI Option mit Projektabhängigkeiten)
#pragma once
using namespace System;
extern "C" __declspec(dllexport) int MathAdd(int a, int b)
{
return CSLibrary::Math::Add(a, b);
}
C Projekt CTest .c (Zusammengestellt als C-Code)
#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;
}
Alle Dateien befinden sich in derselben Lösung, aber in unterschiedlichen Projekten. Ich habe bestätigt, dass das funktioniert hat. Ich hoffe, das hilft jedem, der darauf stößt.
Prost!
Wenn der Code reines C ist, können Sie es möglicherweise in ein visuelles C++ einfügen Montageprojekt ohne zu große Schwierigkeiten. Von dort aus hätten Sie Zugang zu einer regulären .net API.
- 1. Kompilieren von AppleScript aus einer reinen Textdatei
- 2. Wie Sie eine Instanz von hashlib.md5 wiederverwenden
- 3. Wiederverwenden von reinen Python-Funktionen zwischen PL/Python-Funktionen
- 4. Eine ClearCase-Ansicht wiederverwenden
- 5. Wie man ein zufälliges Listenelement in einer reinen Funktion auswählt?
- 6. Wiederverwenden einer Mutation in Relais
- 7. typedef Vererbung von einer reinen abstrakten Basis
- 8. η-Erweiterung in einer reinen funktionalen Sprache
- 9. P/Aufrufen einer reinen C++ - Bibliothek?
- 10. Sinatra mit einer reinen Ruby-Datenbank
- 11. Wie StringBuilder Obj wiederverwenden?
- 12. wie android alertdialog wiederverwenden
- 13. Code von einer anderen Rails-App wiederverwenden
- 14. SWT: So erstellen Sie eine einfache Drucktaste aus einer Aktion
- 15. Wie strukturieren Sie Ihre Entitäten, die Sie wiederverwenden möchten?
- 16. Wiederverwenden Unteransicht
- 17. Wie kann ich HTML/JSP innerhalb einer Seite wiederverwenden?
- 18. Wie füge ich einer Bootstrap 4-Navigationsleiste reinen Text hinzu?
- 19. Wie Debuggen reinen nativen Code auf Android?
- 20. Wie kann ich InputStreams wiederverwenden?
- 21. SqlCommand wiederverwenden?
- 22. Wie kann ich HttpUrlConnection wiederverwenden?
- 23. DECLSPEC_NOVTABLE auf reinen virtuellen Klassen?
- 24. ActiveResource, wie Sie eine Ressource aus einer REST-API mit einem einzelnen Namen abrufen?
- 25. Fragmente wiederverwenden
- 26. Ziehen Sie eine Zeichenfolge aus einer Zeichenkette
- 27. Erstellen Sie eine "Paarung" aus einer Grafik?
- 28. Wiederverwenden Sie die Ansicht Ausgangsmatrix in Matlab
- 29. Wie Sie einen Feldfilter in LINQ zu Entitäten wiederverwenden
- 30. ID während einer jQuery-Funktion wiederverwenden
Wenn ich etwas Zeit bekomme, würde ich gerne eine kleine Demo erstellen. Das klingt lustig. –