INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

LabVIEW DLL in C# verwenden



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

12.01.2009, 17:20
Beitrag #1

TSC Offline
LVF-Team
LVF-Team

Beiträge: 1.882
Registriert seit: Sep 2008

LV 2018 SP1
2008
EN

52379
Deutschland
LabVIEW DLL in C# verwenden
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

"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf!" (Konrad Zuse)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.01.2009, 22:59
Beitrag #2

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
LabVIEW DLL in C# verwenden
' 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"?)

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.01.2009, 09:00
Beitrag #3

TSC Offline
LVF-Team
LVF-Team

Beiträge: 1.882
Registriert seit: Sep 2008

LV 2018 SP1
2008
EN

52379
Deutschland
LabVIEW DLL in C# verwenden
' schrieb: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"?)


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

"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf!" (Konrad Zuse)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.01.2009, 09:28
Beitrag #4

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
LabVIEW DLL in C# verwenden
' schrieb:Ich versuche es mal als Byte-Array. Mit Zahlenwerten hatte ich bisher ja keine Probleme
Ein 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.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.01.2009, 11:17
Beitrag #5

TSC Offline
LVF-Team
LVF-Team

Beiträge: 1.882
Registriert seit: Sep 2008

LV 2018 SP1
2008
EN

52379
Deutschland
LabVIEW DLL in C# verwenden
Ü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.

"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf!" (Konrad Zuse)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.01.2009, 11:21
Beitrag #6

TSC Offline
LVF-Team
LVF-Team

Beiträge: 1.882
Registriert seit: Sep 2008

LV 2018 SP1
2008
EN

52379
Deutschland
LabVIEW DLL in C# verwenden
Weitere erkenntnisse:


Zitat:Problem:
I've completed my program in LabVIEW and it runs without errors. However when I turn the program into an executable I get error 1043 "The property or method is not supported in this version of LabVIEW." I'm using the same version of the Run Time engine as the LabVIEW development environment in which I created my program. Why am I getting this version error?

Solution:
"Version" in this case refers to the Run Time engine versus the LabVIEW development environment. There are various property nodes and invoke nodes that are only available in the development environment. To find out if a property or method is supported in the Run Time engine open the detailed help for the property or method of interest. You'll see a chart at the bottom of the help document that lists various remarks about the node that resembles the following.

[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.

"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf!" (Konrad Zuse)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  dll vonLabVIEW in Matlab Simulink verwenden /LabVIEW -> Matlab XPC hans_p 0 4.768 10.12.2009 10:19
Letzter Beitrag: hans_p
  LabVIEW Dll in VB.NET verwenden Frank Grießbaum 3 5.754 04.10.2006 13:42
Letzter Beitrag: eg

Gehe zu: