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.
Wenn ich etwas Zeit bekomme, würde ich gerne eine kleine Demo erstellen. Das klingt lustig. –