Entwickler-Ecke

WinForms - Datei und Bibliothek können nicht gefunden werden


IsabelleZimmermann - Di 16.10.18 14:38
Titel: Datei und Bibliothek können nicht gefunden werden
Hallo nochmal,

ich habe jetzt versucht Dateien zum Verbindungsaufbau einer SPS in mein Projekt einzubauen.
Die Dateien waren ursprünglich in Visual Basic. Also habe ich sie übersetzt in C#.

Jetzt habe ich eine Datei, die heißt "Hauptformular.cs" und in ihr sind ein paar Funktionen zum Loggen der SPS-Daten, zum Lesen von Daten aus der SPS, zum Schreiben der Daten in die SPS und zur Kommunikation mit der SPS, hier vor allem SPS_Polling().

In dieser Datei möchte ich die Bibliothek "libnodave" einbinden und die Klasse "Namespace.Klassenname" Klasse_SPS_Verbindung1.Klasse_SPS_Verbindung_x.

Es kommt hier aber die Fehlermeldung "Der Typ- oder Namespacename "Klasse_SPS_verbindung1" konnte nicht gefunden werden(möglichweise fehlt eine Using Direktive oder ein Assembly-Verweis).

Die gleiche Fehlermeldung kommt bei using static libnodave;

Ich habe bereits nach dem Problem gegoogelt, bin aber nicht weiter gekommen, weil es weder an den Verweisen liegen kann noch an der using Direktive.

Ich hoffe, dass mir hier weiter geholfen werden kann.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Di 16.10.18 15:30

Schau dir am besten mal über den "Object Browser" im Visual Studio die Assembly an. Dort sollte dann die Klassen und deren Namensbereiche aufgelistet sein.

Wenn, dann muß es selbstverständlich nur using libnodave; heißen (also ohne static).


IsabelleZimmermann - Di 16.10.18 15:45

Wie komme ich denn zum "Object Browser"? Ich sehe nur den Projektmappen-Explorer in der rechten Fensterseite.


Th69 - Di 16.10.18 15:49

Du stellst dich aber ein wenig unbeholfen an. Schau mal in das Menü "Ansicht" (engl. "View").
Und Internet-Suchmaschinen gibt es auch. ;-)


IsabelleZimmermann - Di 16.10.18 15:50

Ich sehe es gerade. Bei der Klasse_SPS_Verbindung ist kein Pfeil zum Aufklappen, wo die Klasse angezeigt wird. Deshalb kann die Klasse auch nicht gefunden werden.


IsabelleZimmermann - Di 16.10.18 16:08

Hab jetzt auch im Objektkatalog geschaut. Dort sind nur 3 Namespaces. Für die Properties für Program.cs mit Namespace und Objekt und für Form1.cs, welches Form1.Designer.cs enthält.

Die Frage ist nun, wie ich das Problem lösen kann.
Ich kann aber nochmal im Internet suchen, falls ich mich wieder zu unbeholfen anstelle.


Ralf Jansen - Di 16.10.18 16:11

Zitat:
Klasse_SPS_Verbindung1.Klasse_SPS_Verbindung_x


Das scheint ja was von dir zu sein. Zeig uns doch am besten mal wie du diese Klassen definiert hast. Dann können wir dir vermutlich auch sagen warum das nicht funktioniert.


IsabelleZimmermann - Di 16.10.18 16:40

Ich hoffe, ein screenshot reicht aus, siehe Anhang.

Hab jetzt herausgefunden, dass bei Buildvorgang (Eigenschaften der Datei im Projektmappen-Explorer) bei Buildvorgang nur "Inhalt" stand, aber nicht "Kompilieren".

Das habe ich jetzt zumindest schon mal geändert.


Th69 - Di 16.10.18 17:38

Kompiliert denn jetzt dein Projekt?

PS: Du solltest dir bessere Namen überlegen - einen Namensbereich Klasse_... zu nennen, ist sehr verwirrend.


IsabelleZimmermann - Di 16.10.18 18:55

Ja das stimmt. Ich werde den Namensbereich umbenennen.
Mein Projekt versucht zu kompilieren aber es sind noch Fehler im Quellcode.

Ausserdem tritt der Fehler noch auf dass die Bibliothek libnodave nicht gefunden wird.
Aber ich kann sie leider auch nicht zu den Verweisen hinzufügen weil sie wahrscheinlich keine Assembly Datei ist.

Morgen versuch ich noch die restlichen Fehler weg zu bekommen.Das meiste sind aber solche Fehler dass eine Funktion oder ein Variablenname nicht gefunden wird.
Die sind dann in einer anderen Datei. Aber diese Fehler bekommen ich weg.
Ausser wenn sich der Fehler auf die eine Bibliothek bezieht. Den Fehler hab ich noch nicht weg bekommen.


Th69 - Mi 17.10.18 09:33

Laut Siemens Logo! C# und LibNoDave – Teil 1: Verbindung herstellen [http://blog.hessonline.net/2016/04/siemens-logo-c-und-libnodave-teil-1-verbindung-herstellen/] gibt es eine "libnodave.net.dll", welche du als Verweis hinzufügen mußt.

Und der Source-Code steht unter libnodave [https://github.com/netdata-be/libnodave] zu Verfügung (und im "Dot.NET"-Ordner befindet sich diese Assembly).


IsabelleZimmermann - Mi 17.10.18 10:55

Danke.
Weißt du auch, ob es in der Assembly libnodave.net.dll eine Methode int daveGetS16(byte[]) bzw. int daveGetS32(byte[]) gibt?

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Mi 17.10.18 11:25

Nein, aber schau doch einfach mit dem "Object Browser" nach.


Ralf Jansen - Mi 17.10.18 11:29

Schau doch einfach nach. TH69 hat dir das Repository mit dem Sourcecode verlinkt und der bereits hier genannte Object Browser zeigt dir auch das Klassenmodel in der Assembly :gruebel:

Und nein in der Form gibt es die Methoden da nicht. Du scheinst dich an der API der nicht gemanagten (nativen) Dll zu orientieren die kannst du so nicht direkt in der gemanagten Assembly für DOT.Net finden da das ja ein vollständig Objektorientiertes System ist. Heißt das das in irgendeiner Klasse steckt. Hier ist die Entsprechung vermutlich die getS16()/getS32() Methoden in der daveConnection Klasse. Falls du dich an Beispielen für die native Dll lang hangelst werden die dir nicht direkt helfen. Schau lieber auf Beispiele die auch die Assembly für DOT.Net benutzen.


IsabelleZimmermann - Mi 17.10.18 13:50

Ok, mach ich.
Hab schon einiges gefunden in daveConnection und daveInterface.


IsabelleZimmermann - Mo 22.10.18 09:07

Hallo,

jetzt habe ich eine neue Fehlermeldung. Allerdings erst nach dem Kompilieren wenn ich in dem Windows-Fenster versuche die Verbindung zu SPS zu starten, siehe screenshot.

Ich hab auch schon gegoogelt nach dem Fehler. In einem Forum stand, dass die Bibliothek "libnodave.net.dll" in den System32-Ordner und in den Ordner SysWOW64 rein kopiert werden soll. Das hab ich gemacht, aber ohne Erfolg.


Th69 - Mo 22.10.18 09:42

Das System findet die native Lib "libnodave.dll" (oder eine deren anderen abhängigen Libs) nicht - diese ist eine andere als die .NET-Assembly "libnodave.net.dll".

In der Eingabeaufforderung (Konsole) kannst du mit dem Befehl "where libnodave.dll" abfragen, ob diese DLL im Suchpfad ist.


IsabelleZimmermann - Mo 22.10.18 10:36

Jetzt habe ich die die native Lib libnodave.dll in meinen Projektordner kopiert.
Und es erscheint die Meldung "Es wurde versucht eine Datei mit falschem Format zu laden".

Ist dies eine 32 Bit Datei? Unter Projekteigenschaften habe ich 64 Bit-CPU ausgewählt.


IsabelleZimmermann - Mo 22.10.18 10:55

Aber wenn ich auf "32 Bit bevorzugen" umschalten und Any CPU, bekomme ich an anderer Stelle die gleiche Fehlermeldung, weil ich sapnco.dll unter Verweisen habe und diese ist 64 Bit.


Ralf Jansen - Mo 22.10.18 11:08

Zitat:
Ist dies eine 32 Bit Datei? Unter Projekteigenschaften habe ich 64 Bit-CPU ausgewählt.


Das weißt du eher als wir.

Zitat:
Aber wenn ich auf "32 Bit bevorzugen" umschalten und Any CPU, bekomme ich an anderer Stelle die gleiche Fehlermeldung, weil ich sapnco.dll unter Verweisen habe und diese ist 64 Bit.


Finde raus in welcher Bittigkeit deine nativen Dlls sind. Als du die runtergeladen hast wurdest du sicher gefragt ob du die 32 oder 64 bit Version willst bzw. es wurde dir gesagt was das für eine Bittigkeit ist. Und sobald du das weißt solltest du da wo du "Any CPU" eingetragen hast explizit die Bittigkeit eintragen die die du auch benutzt.

Wenn alles 64Bit ist solltest du also auch deine Startassembly in der Solution auf 64Bit setzen.


IsabelleZimmermann - Mo 22.10.18 11:51

Ok, danke.