Allgemein
Knowledge Base
- Neue Struktur (In Arbeit)
- Computertechnisches
Community
Privat
Mit dieser Step-By-Step Anleitung wird gezeigt wie man ein C# Array mit unmanaged C++ beschreiben kann. Dazu wird eine c++-dll erzeugt und diese in C#-Code eingebunden.
In Visual Studio 2010 ein neues Projekt anlegen: Visual C++ -> Win32 -> Win32 Project. Wir nennen es "UnmanagedDllTest
". Dann die Application Settings auf "DLL" stellen. Ein Projekt wird erzeugt.
Es können alle erzeugten Ordner und Dateien mit Ausnahme von dllmain.cpp
gelöscht werden
Man definiert eine Funktion die in diesem Beispiel FillArray
heißt. Sie beschreibt die ersten zehn Werte eines ushort[]
Arrays mit aufsteigenden Zahlen. Der Nachfolgende Code ist der komplette Inhalt von dllmain.cpp
.
Wichtig ist hierbei das extern "C"
, wenn dieses fehlt kann die DLL nur mit hilfe eines manged C++ Wrappers in .NET verwendet werden.
Die DLL (UnmanagedDllTest.dll
) wird kompiliert und landet wie gewohnt im debug
Subfolder des DLL-Projektes.
Ein neues Projekt anlegen: Visual C# -> Windows -> Console Application
Nach kompilieren und starten gibt es zunächst eine Exception, denn die dll wurde nicht gefunden. Sie muss erst in den debug-Ordner des c#-Projektes kopiert werden.
Danach kann das Programm erneut gestartet werden und läuft:
Interessanterweise muss man von C# keinen Pointer auf ein Array übergeben (was zweifelsohne möglich wäre) sondern das Array direkt. Intern wird bei komplexen Datentypen ein Pointer verwendet. Wie man andere, komplexere Datentypen (Objekte) von C++ aus anspricht habe ich noch nicht ausprobiert.
Der Aufruf aus C# scheint einen gewissen Overhead zu erzeugen, sodass es sich nur lohnt unmanaged c++ code zu verwenden wenn diese wirklich viel schneller ist. Augenscheinlich ist der JIT von .NET mittlerweile so gut dass es kaum Performancevorteile, ja sogar nachteile bringt. Meine Funktionen zur Helligkeits- und Kontrastveränderung von Bildern sind in C# mit Pointern jedenfalls schneller als eine äquivalente C++ Version.