C++ DLL zur Verfügung stellen
-
Hi,
ich mache gerade meine ersten Versuche mit C#. Eigentlich will ich nur testen, ob eine von mir geschriebene DLL (in C/C++) auch unter C# verwendet werden kann. Hab aber keine "anfängergerechte" Anleitung gefunden. Mein Ansatz (aus MSDN):
[DllImport("myDLL.dll")] public static extern int dllLoad(string filename); public static extern int dllWork(uint precision);
Da kommt auch schon der erste Fehler:
The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?)
Habt ihr einen Tipp oder Link für mich?
Danke,
don_basto.
-
Um C/C++ DLL in Scriptsprachen zuladen kann ich dir nur Swig [url] www.swig.org [/url] empfehlen.
Swig generiert aus den C/C++ Header ferige C# Klassen die wiederum die DLL
laden und entsprechende Wrapper für deine ZielScriptsprache (in deinem Fall C#) erzeugen.Swig funktioniert nebenbei auch noch mit einer Reihe anderer Scriptsprachen wie z.b. (Perl, Java, Python ... )
-
Danke für den Tipp, allerdings will ich nur einen kleinen Test machen. Gibt's eine andere Möglichkeit?
Was bedeutet die Fehlermeldung?
-
DllImportAttribute ist der Name der Klasse des Attributs, dass du auf die Funktionsdefinition anwenden möchtest (http://msdn2.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx). Die Klasse befindet sich im namespace System.Runtime.InteropServices. Du musst entweder den Namen voll ausschreiben (System.Runtime.InteropServices.DllImport) oder vorher den namespace usen. Namespaces sollten dir kein Fremdwort sein, amsonsten hast du schon zu weit vorgegriffen.
-
Das war's. Hat eine using-Anweisung gefehlt! Bin mit der Syntax nicht vertraut. Bei der Suche nach DllImport bin ich auch auf der Seite gelandet, aber nach meinem C++-Verständnis sind DllImport und DllImportAttribute zwei unterschiedliche Sachen.
Ausserdem hab ich keinen Plan, was eine eckige Klammer rundrum bedeutet. Alles sehr verwirrend. Aber meine Dll läuft und gut!
-
Die eckigen Klammern sagen aus dass dies ein Attribut auf die nächste Klasse (Methode, Feld) ist.
[DllImport("myDLL.dll")] public static extern int dllLoad(string filename);
sagt also aus, dass Du die Deklaration von dllLoad mit einem DllImportAttribute verknüpfst
- das veranlasst das Framework dazu, die Funktion dllLoad eben in der DLL "myDLL.dll" zu suchen.
Attribute sind eine schöne Sache. Ein anderes Beispiel:
[Obsolete()] public class Xyz { ... };
Meldet jedesmal, wenn Du die Klasse Xyz verwendest, eine Compilerwarnung, dass die Klasse eigentlich überflüssig geworden ist.
-
Also handelt es sich bei den Ausdrücken in Klammern um Attribute. Die Klassen solcher Ausdrücke heissen deswegen EinAusdruckAttribute. Alles klar.