LabVIEWForum.de
Erstellung C# List in LabVIEW - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: ActiveX & .Net (/Forum-ActiveX-Net)
+---- Thema: Erstellung C# List in LabVIEW (/Thread-Erstellung-C-List-in-LabVIEW)



Erstellung C# List in LabVIEW - Svenni - 25.09.2015 16:22

Hallo zusammen,

ich hab evon C# leider keine Ahnung und nun habe ich folgendes Problem.

Ich hab eiene dll von einem Zulieferer bekommen, um Daten auf ein Gerät zu schreiben und Daten zu lesen.
Leider hat der Zulieferer keine Doku für die dll erstellt. Er hat mir dafür den Quellcode einer kleinen Anwendung geschickt, die er erstellt hat, um die dll zu testen.
Aus diesem Qeullcode habe ich nun auch fast alle Funktinen in LV nachgestellt und sie laufen.
Nun hänge ich bei der Erstellung einer Liste.

Der Quellcode sieht wie folgt aus:

Zitat:private void LoadXML(string _fileName)
{
string assemblyPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string xmlString = File.ReadAllText(_fileName, Encoding.Default);

List<Klz.LanguageItemInput> languageList = new List<Klz.LanguageItemInput>(2);

Klz.LanguageItemInput inputItem = Klz.LanguageItemInput()
{
FontFile = assemblyPath + "\\" + "Latin1.fnt",
LangFile = assemblyPath + "\\" + "de-DE.lan",
PrinterConvFile = assemblyPath + "\\" + "iso8859cp437.bin",
Lang = "de-DE"
};

Klz.LanguageItemInput inputItem2 = new Klz.LanguageItemInput()
{
FontFile = assemblyPath + "\\" + "Latin1.fnt",
LangFile = assemblyPath + "\\" + "en-US.lan",
PrinterConvFile = assemblyPath + "\\" + "iso8859cp437.bin",
Lang = "en-US"
};

Klz.LanguageItemInput inputItem3 = new Klz.LanguageItemInput()
{
FontFile = assemblyPath + "\\" + "ru-RU.fnt",
LangFile = assemblyPath + "\\" + "ru-RU.lan",
PrinterConvFile = assemblyPath + "\\" + "iso8859cp437.bin",
Lang = "ru-RU"
};

languageList.Add(inputItem);
languageList.Add(inputItem2);
languageList.Add(inputItem3);

m_UploadProjectInput = new Klz.UploadProjectInput()
{
LogoFile = assemblyPath + "\\" + "MLogo.logo",
//XMLDoc = m_myXDocument.ToString(),

XmlString = xmlString,
Languages = languageList
};

Dies habe ich versucht in LV umzusetzen. Daraus ist Vi aus dem Anhang enstenden.

[attachment=54157]

Nun bekomme ich eine Fehlerhmeldung bei der Methode "LIst1[[Klz.LanguageItemInput..]. Screenshot im Anhang.

[attachment=54158]

Kann mir jemand helfen?

Danke!!!

Schöne Grüße
Sven


RE: Erstellung C# List in LabVIEW - rolfk - 28.09.2015 09:50

(25.09.2015 16:22 )Svenni schrieb:  Hallo zusammen,

ich hab evon C# leider keine Ahnung und nun habe ich folgendes Problem.

Ich hab eiene dll von einem Zulieferer bekommen, um Daten auf ein Gerät zu schreiben und Daten zu lesen.
Leider hat der Zulieferer keine Doku für die dll erstellt. Er hat mir dafür den Quellcode einer kleinen Anwendung geschickt, die er erstellt hat, um die dll zu testen.
Aus diesem Qeullcode habe ich nun auch fast alle Funktinen in LV nachgestellt und sie laufen.
Nun hänge ich bei der Erstellung einer Liste.

Der Quellcode sieht wie folgt aus:

Zitat:private void LoadXML(string _fileName)
{
string assemblyPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string xmlString = File.ReadAllText(_fileName, Encoding.Default);

List<Klz.LanguageItemInput> languageList = new List<Klz.LanguageItemInput>(2);

Klz.LanguageItemInput inputItem = new Klz.LanguageItemInput()
{
FontFile = assemblyPath + "\\" + "Latin1.fnt",
LangFile = assemblyPath + "\\" + "de-DE.lan",
PrinterConvFile = assemblyPath + "\\" + "iso8859cp437.bin",
Lang = "de-DE"
};

Klz.LanguageItemInput inputItem2 = new Klz.LanguageItemInput()
{
FontFile = assemblyPath + "\\" + "Latin1.fnt",
LangFile = assemblyPath + "\\" + "en-US.lan",
PrinterConvFile = assemblyPath + "\\" + "iso8859cp437.bin",
Lang = "en-US"
};

Klz.LanguageItemInput inputItem3 = new Klz.LanguageItemInput()
{
FontFile = assemblyPath + "\\" + "ru-RU.fnt",
LangFile = assemblyPath + "\\" + "ru-RU.lan",
PrinterConvFile = assemblyPath + "\\" + "iso8859cp437.bin",
Lang = "ru-RU"
};

languageList.Add(inputItem);
languageList.Add(inputItem2);
languageList.Add(inputItem3);

m_UploadProjectInput = new Klz.UploadProjectInput()
{
LogoFile = assemblyPath + "\\" + "MLogo.logo",
//XMLDoc = m_myXDocument.ToString(),

XmlString = xmlString,
Languages = languageList
};

Meiner Meinung nach fehlt im C# Code mindestens das rot geschriebene Wort. Und das hat eigentlich auch schon beinahe direkt mit einem Deiner Probleme zu tun. Du solltest den Konstruktor für LanguageItemInput ebenfalls in die Loop reinnehmen. Das ist nämlich das LabVIEW Equivalent für das "new" in C#. Du erzeugst jetzt ein Objekt und gibst das jeweils an die Add Methode aber Du solltest jeweils ein neues Objekt instantieren.

Das Hauptproblem wo Deine Fehlermeldung herkommt ist dass Du an die Add Methode ein nicht initialisiertes Objekt gibst (Deine .Net Konstante vor der Loop). Dort müsstest Du ebenfalls einen Konstruktor haben für die LanguageList. Leider ist es aber so dass LabVIEW keine generieken Datentypen unterstützt (List<something>). Wenn Deine .Net Assembly keinen expliziten Datentypen dafür bereitstellt gibt es nur zwei Möglichkeiten um es trotzdem zum Laufen zu bringen.

1) Du schreibst eine Wrapper Assembly die diesen Datentypen zur Verfügung stellt (oder bringst den Lieferanten dazu das in seine Library hineinzubauen).
2) Mit .Net Reflection kann man auch einen Datentypen generieren. Das ganze ist zwar relativ kompliziert zu begreifen und kaum zu erinnern aber mittels Vorbild einigermaßen zu tun.

Eine Suche hier auf dem Forum hätte Dich auch zu diesem Beitrag bringen können.