| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX |
Autor
|
Thema: NXopen dll Vb->C# (1221 / mal gelesen)
|
DerFräser Mitglied Programmierer
Beiträge: 113 Registriert: 09.07.2006
|
erstellt am: 08. Jul. 2020 17:17 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich brauchte mal eine Info zum Übersetzen eines VB-Programms nach C#. Die Aufgabe ist, eine DLL(Windows-Form) die sich aus dem NX löscht wenn meine Winform geschlossen wird. Ich habe auf der Seite https://www.eng-tips.com/viewthread.cfm?qid=420827 dies gefunden: Code:
Module unload_modeless_winform_immediately Dim myform As New Form1 Dim s As Session = Session.GetSession() Dim ufs As UFSession = UFSession.GetUFSession() Public Sub Main() myform.Show() Dim checkThread As New Thread(New ThreadStart(AddressOf IsFormDismissed)) checkThread.Start() End Sub Public Sub IsFormDismissed() Do If myform.IsDisposed() = True Then UnloadNXLibrary() End If Thread.Sleep(30000) Loop End Sub
Ich kenn mich in C# nicht mit Delegates aus, und habe jetzt ein Problem: new ThreadStart(IsFormDismissed) Code: class Test1 { static readonly Session Sess = Session.GetSession(); static readonly Part Wp = Sess.Parts.Work; static readonly UFSession Ufs = UFSession.GetUFSession(); //private Form1 MyForm = new Form1(); // todo geht nicht public static void Main(string[] args) { Form1 MyForm = new Form1(); MyForm.Show(); var checkThread = new Thread(new ThreadStart(IsFormDismissed)); } ~~~~~~~~~~~~~~~ }
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 09. Jul. 2020 16:42 <-- editieren / zitieren --> Unities abgeben: Nur für DerFräser
Hallo DerFräser, ein Hund wird wahrscheinlich hier begraben sein: Zitat: //private Form1 MyForm = new Form1(); // todo geht nicht
IsFormDismissed will auf die Variable myform zugreifen, was nicht funktionieren kann, wenn sie auskommentiert ist. Daneben würde ich auf VB den Thread anders instanzieren, z.B.: Code: Dim checkThread As New Thread(AddressOf IsFormDismissed)
Versuch's einfach mal, ob das auch bei C# hilft, falls es nicht allein an der fehlenden Variable liegt. Gruß, Michael ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DerFräser Mitglied Programmierer
Beiträge: 113 Registriert: 09.07.2006
|
erstellt am: 10. Jul. 2020 18:39 <-- editieren / zitieren --> Unities abgeben:
Ich habe die Lösung gefunden, stimmt nicht so ganz. Ein anderer Programmierer hat den Fehler gesehen. Also das Ganze ist eine Konsolenanwendung in VS, worin eine Winform erstellt wird. Anschliessend wird in VS(Projekteigenschaften) umgestellt auf Klassenbibliothek. Im Code wird nach der Darstellung der Form, ein zweiter Thread gestartet, der immer mal wieder prüft ob das Fenster noch läuft; wenn nicht wird die DLL aus NX entladen. Mein Fehler (Delegate => Methodenzeiger) die Methode war noch nicht eingetippt. Es geht jetzt eine Winform-Anwendung im Designer erstellen und nach dem Beenden, kann ich den Quellcode sofort ändern. Man kann das Programm auch in laufenden NX-Session debuggen. Im Debugger kann man sich die laufenden NX-Objekte detaillierter betrachten, echt geil kein Journal-Gefummel mehr nötig. MfG
[Diese Nachricht wurde von DerFräser am 10. Jul. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 11. Jul. 2020 08:44 <-- editieren / zitieren --> Unities abgeben: Nur für DerFräser
Zitat: Original erstellt von DerFräser: ... die Methode war noch nicht eingetippt.
Das Fehlen der Methode ist ja sooo offensichtlich, daß ich es nicht für notwendig erachtet habe, das separat zu erwähnen. Oftmals wird ja hier auch nur partieller Code gepostet .... Das Auskommentieren der globalen Variable für die Form halte ich dennoch für einen Fehler. Ohne diese Variable wird die Sub nicht funktionieren. Zitat: Im Debugger kann man sich die laufenden NX-Objekte detaillierter betrachten, echt geil kein Journal-Gefummel mehr nötig.
Das ist nicht von den Projekt-Einstellungen, sondern vielmehr von der Existenz einer Autoren-Lizenz abhängig. .. und ganz nebenbei: Wenn die Unloadoption auf Immediately steht, braucht's m.E. keine eigene Routine für's Unload
Gruß, Michael ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DerFräser Mitglied Programmierer
Beiträge: 113 Registriert: 09.07.2006
|
erstellt am: 13. Jul. 2020 06:45 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von mseufert:
Das ist nicht von den Projekt-Einstellungen, sondern vielmehr von der Existenz einer Autoren-Lizenz abhängig. .. und ganz nebenbei: Wenn die Unloadoption auf Immediately steht, braucht's m.E. keine eigene Routine für's Unload
Gruß, Michael
Hallo, klar das Auskommentieren war falsch. Ich habe die jetzt oben die Deklaration gemacht, damit die Methoden auf die Form zugreifen können. Das mit der Unloadmethode weis ich nicht umzusetzen und die Endlosschleife gefällt mir auch noch nicht, aber es läuft schon mal. Mein Code sieht jetzt so aus:
Code: class StartForm { static readonly Session Sess = Session.GetSession(); static readonly Part Wp = Sess.Parts.Work; static readonly UFSession Ufs = UFSession.GetUFSession(); public static Form1 MyForm; // public static void Main(string[] args) { MyForm = new Form1(); MyForm.Show(); var checkThread = new Thread(new ThreadStart(IsFormDismissed)); checkThread.Start(); // Zeile vergessen } public static void IsFormDismissed() { do { if (MyForm.IsDisposed) { UnloadNXLibrary(); } Thread.Sleep(20000); } while (true); } public static void UnloadNXLibrary() { Assembly runningProgram = Assembly.GetExecutingAssembly(); Ufs.UF.UnloadLibrary(runningProgram.Location); } public static int GetUnloadOption(string dummy) { return (int)Session.LibraryUnloadOption.Explicitly; } } }
MfG [Diese Nachricht wurde von DerFräser am 15. Jul. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Technischer Sachbearbeiter Speziallöschanlagen (m/w/d) | Zur Unterstützung unseres Teams suchen wir für unseren Standort Eisenberg-Petersberg zum nächstmöglichen Zeitpunkt einen Technischen Sachbearbeiter Speziallöschanlagen (m/w/d) Die Systeex Brandschutzsysteme GmbH ist ein mittelständisches Unternehmen mit Hauptsitz in Hanau. Mit der Marke Systeex zählen wir zu den Top 5 unserer Branche im Brandschutz.... | Anzeige ansehen | Gebäude-, Versorgungs-, Sicherheitstechnik |
|
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 13. Jul. 2020 08:16 <-- editieren / zitieren --> Unities abgeben: Nur für DerFräser
Hallo DerFräser, in VB sieht das so aus: Code: Public Shared Function GetUnloadOption(ByVal dummy As String) As Integer Return Session.LibraryUnloadOption.Immediately End Function
Das ist m.W. die eleganteste Methode, um NX mitzuteilen, ob und wann eine Library entladen werden soll. Über die SuFu finden sich noch mehr Details. Mehr als den Dreizeiler braucht's aber nicht. Gruß, Michael ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|