alten C/C++ Code in .net verwenden
-
Hallo zusammen,
dies ist mein erster Post. Ich würde mich eher in die c#-Kategorie einstufen.
Ich habe noch nie ernsthaft in C++ programmiert auch nicht C++/CLI.
Deshalb habe ich eine Frage von eher technischer Natur. Wie kann man, oder ist
es überhaupt möglich, alten C/C++ Code in managed Assemblies verwenden, um dann
aus nativen .net Anwendungen die Funktionen aufzurufen.Genauer gesagt habe ich eine funktionierende in C geschriebene Win32-Konsolenanwendung(projekt mit makefile.bat), die mit tastatureingaben
funktioniert und gewisse ereignisse im System wiedergibt oder in textdateien loggt. Es auch möglich verschiedene Nachrichten zu versenden.(Ich möchte nicht
tiefer ins Detail gehen, weil das nichts mit meiner Frage zu tun hat)
Das Hauptprogramm besteht lediglich aus main.c welches den standard in-und output präsentiert. Alle anderen Klassen und Funktionen sind getrennt
(ich würde sagen MVC trifft zu) nun möchte ich eine managed oder unmanaged dll erstellen welche mir nur die Nachrichten die das Programm ausgibt oder
engegennimmt für meine c#.net applikationen zur Verfügung stellt. Eine Ereignisbehandlung wäre wünschenswert.Ich wäre sehr dankbar um konkrete Beispiele. Wegen mangelnden Wissens schaffe
ich es Leider nicht ein mal eine simple Klasse in C++/CLI zu erstellen.
Deswegen möchte ich im voraus für allzu dumme Fragen entschuldigen.Einen schönen Tag wünscht
Balaban_S
-
Balaban_S schrieb:
Wie kann man, oder ist
es überhaupt möglich, alten C/C++ Code in managed Assemblies verwenden, um dann
aus nativen .net Anwendungen die Funktionen aufzurufen.Um nativen Code mit verwaltetem zu mischen, musst die Compileroption "/clr"
verwendet werden (anstatt "/clr:pure" für rein verwalteten Code):
Project->Properties->General.
Dann der vorletzte Punkt: "Common Language Runtime support"Wenn du alles in eine Class Library steckst, die nach aussen hin nur verwaltete
Schnittstellen bereitstellt, sollte sich diese auch mit anderen .NET Sprachen
(C#, VB...) verwenden lassen.Balaban_S schrieb:
Ich wäre sehr dankbar um konkrete Beispiele. Wegen mangelnden Wissens schaffe
ich es Leider nicht ein mal eine simple Klasse in C++/CLI zu erstellen.
Deswegen möchte ich im voraus für allzu dumme Fragen entschuldigen.public ref class foo { public: foo() {System::Windows::Form::MessageBox::Show("Hello World");} };
-
Zuerst einmal Danke für die Antwort.
Jetzt habe ich eine ClassLib erstellt und alle Dateien aus dem Programm zum Projekt
hinzugefügt.beim ersten Versuch das projekt zu erstellen Habe ich folgende Fehlermeldung
Fehler 1 Befehlszeile error D8045 : Die C-Datei ".\main.c" kann nicht mit der /clr-Option kompiliert werden. cl
Wie weiter?
Nebenbei bemerkt handelt es sich um das CPI-ADK von AVM falls das jemand schon kennt.
Gruss Balaban_S
-
Hallo,
jetzt nach den Kompileroptionen und \TP habe ich noch allen Dateien#include "stdafx.h"
hinzugefügt, habe allerdings beim Erstellen nach dem 100'sten Fehler abgebrochen.
Gruss
Balaban_S
-
Balaban_S schrieb:
Jetzt habe ich eine ClassLib erstellt und alle Dateien aus dem Programm zum Projekt
hinzugefügt.beim ersten Versuch das projekt zu erstellen Habe ich folgende Fehlermeldung
Fehler 1 Befehlszeile error D8045 : Die C-Datei ".\main.c" kann nicht mit der /clr-Option kompiliert werden. cl
Wenn die main.c so ausschaut wie ich jetzt glaube dass sie ausschaut, dann kanns
nicht funktionieren. In der class lib muss eine (oder mehrere) Klassen erzeugt
werden, die die entsprechende Funktionalität kapseln.
Eine main() Funktion gibt's da drinnen nicht.
-
Ok
Ich werde das heute noch genauer anschauen.Danke
Gruss
-
Ich seh schon, dass das mit den Headerdateien und den benötigten Bibliotheken zusammen über 50 Dateien im Projekt eine Menge Arbeit mit sich bringen wird.
Ich muss das abscchätzen, bevor ich mich damit an die Arbeit mache.
Schliesslich muss ich mich ja auch noch in den Stoff einarbeiten.
Danke.Gruss Balaban_S
-
Bennene Deine Dateien nach *.cpp um und dann geht es.
-
Dann habe ich die die gleichen Fehlermeldungen.
Wenn es mit wenig Arbeit gegangen wäre, hätte ich es gemacht. So kann ich das
leider nicht mehr weiter verfolgen.Sind einfach zu viele Errors, die mir nichts sagen.
Ich mach es mit C# neu.
Danke für die Hilfe.
Gruss
Balaban_S