LabVIEW DLL in C# verwenden - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: DLL & externer Code (/Forum-DLL-externer-Code) +---- Thema: LabVIEW DLL in C# verwenden (/Thread-LabVIEW-DLL-in-C-verwenden) |
LabVIEW DLL in C# verwenden - TSC - 12.01.2009 17:20 Hallo zusammen, ich habe eine kleine DLL in LabVIEW erstellt. Die DLL enthält ein einfaches VI weches eienn Wert verdoppelt. Begonnen habe ich mit einem Double. Die erstellte DLL habe ich dann in C# aufgerufen. Aufrufsyntax: [DllImport("D:\malZwei.dll")] static extern double MalZwei(double zahl); Das funktionierte auch wunderbar. Alles bestens. Nun versuche ich allerdings, einen String zu übergeben. Daran scheiter ich. Kann mir jemand verraten, welche Typen ich in der LabVIEW-DLL verwenden muss und welche Typen dazu passend in C# abgerufen werden können? Mir schwebt folgender Aufruf vor: [DllImport("D:\malZwei.dll")] static extern void MalZwei(string str); Es soll also lediglich ein String von C# nach LabVIEW übergeben werden. Vielen Dank, Torsten LabVIEW DLL in C# verwenden - IchSelbst - 12.01.2009 22:59 ' schrieb:Es soll also lediglich ein String von C# nach LabVIEW übergeben werden.Also in Sachen C# (also .Net) kenn ich mich gar nicht aus. Ich weiß nur eins: Strings, also AnsiString, WideString etc, per DLL zu übergeben ist immer mit Problemen verbunden. Das liegt am Memorymanager eines jeden Systems, der die Strings (beachte: die haben einen Datenoverhead) verwaltet. Willst du zwei Systeme verbinden (DLL!), müssen sich die Memorymanager vertragen, wenn z.B. Strings übergeben werden sollen. Strings als solche würde ich nie übergeben - lieber PChars. Definiere die Daten als PChar. Alloziere in C# (wenn das überhaupt noch geht) einen Speicher, auf den der PChar zeigt. Den Pointer übergibst du dann. Die Gegenseite soll die Daten dann zu sich kopieren. Dann kann nichts passieren. (Und falls PChar in C# [*grübel*][CundKeinPChar?][*KannNichtSein*] nicht geht: gibst einen "const string"?) LabVIEW DLL in C# verwenden - TSC - 13.01.2009 09:00 ' schrieb:Also in Sachen C# (also .Net) kenn ich mich gar nicht aus. Danke für die guten Infos. C# und C sind nicht so verwandt wie es sich anhört, manchmal leider und manchmal zum glück nicht. So gibt es in C# zwar Zeiger, aber der dazugehörige code muss als UNSAFE deklariert werden. ich persönlcih vermeide sowas gerne. Aber du hast mich auf die Idee gebracht, einen String nciht direkt als String zu übergeben. Ich versuche es mal als Byte-Array. Mit Zahlenwerten hatte ich bisher ja keine Probleme, mal schauen wies mit Array aussieht. Und sonst werd ich mich mal nach static Strings umschauen. LG Torsten LabVIEW DLL in C# verwenden - IchSelbst - 13.01.2009 09:28 ' schrieb:Ich versuche es mal als Byte-Array. Mit Zahlenwerten hatte ich bisher ja keine ProblemeEin Array ist aber keine Zahl - eher ein String. In Nicht-.Net gibt es statische Arrays und dynamische. Statische Arrays haben normalerweise keinen Overhead, dynamische schon (zumindest in Delphi for Win32). [*grübel*] Du bekommst mit einem Array ein ähnliches Problem wie mir Strings. Arrays sind komplexte Datentypen, die auch nur mit Pointern übergeben werden können. Ich gehe aber mal davon aus, dass die C#-IDE (respektive der Kompiler) so gebaut ist, dass ein solcher Pointer nach außenhin gar nicht sichtbar und zugänglich ist. Nicht-komplexte Datentypen wie double werden über den Stack übergeben, komplexe Datentypen eben indirekt per Pointer. LabVIEW DLL in C# verwenden - TSC - 13.01.2009 11:17 Über die richtigen Google-Schlagwörter gefunden: http://zone.ni.com/devzone/cda/epd/p/id/6050 Da hab ich nun mal abgekupfert. An meinem VI kommt der richtige String an (habe ihn über einen Dialog ausgegeben). Allerdings sollte das VI eigentlich eine TXT Datei erzeugen. Das passiert leider nicht. Also habe ich mir mal ausgeben lassen ob Fehler auftreten. Siehe da: Fehlercode: 1043 Beschreibung: Methodenknoten in Gen.vi->Gen.vi.ProxyCaller An der Stelle kann ich also erstmal weiter Suchen. Dieser Fehler tritt nur ein, wenn ich das VI über die DLL aufrufe, nicht wenn ich es manuell starte. LabVIEW DLL in C# verwenden - TSC - 13.01.2009 11:21 Weitere erkenntnisse: Zitat:Problem: [Quelle: http://digital.ni.com/public.nsf/allkb/1E1...625731C006CCB5A] Anscheinend kann ich das VI also so nicht lassen und muss mir was neues ausdenken. Schade. |