Imports System.Management wird nicht hinzugefügt

  • VB.NET
  • .NET 4.5

SSL ist deaktiviert! Aktivieren Sie SSL für diese Sitzung, um eine sichere Verbindung herzustellen.

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Imports System.Management wird nicht hinzugefügt

    Hi,

    ich möchte sicherstellen, dass nur EINE Instanz meines Programms gestartet werden kann. Dazu verwende ich die Funktion getLocalProcessOwner

    Damit man diese Funktion verwenden kann, muss man System.Management importieren und den Verweis System.Management hinzufügen.

    Das hab ich in anderen Programmen schon so gemacht und da hat es ohne Probleme funktioniert. Diesmal aber funzt es NICHT.

    Der Import und der Verweis gehen durch ... aber Imports System.Management wird als "nicht verwendet" dargestellt und die Funktion getLocalProcessOwner wird (folgerichtig) nicht gefunden. (s. Anhang 2)

    Im Dialog zum hinzufügen von Verweisen sieht aber alles ganz normal aus. Allein, der Versionsunterschied macht mich ein bissl nervös. (s. Anhang 1)

    Was mache ich denn falsch?

    Ich meine zu verstehen, was so ein "Imports" macht ... da werden Klassenbibliotheken zugewiesen.

    Was so ein Verweis macht, verstehe ich jedoch nicht so richtig. Ich meine, da werden Qualifier in die Suchreihenfolge aufgenommen ?

    Ich hoffe, jemand kann mir nachsichtig helfen.

    LG
    Peter
    Bilder
    • s 2017-06-18 21-55-285.jpg

      203,33 kB, 1.416×848, 16 mal angesehen
    • s 2017-06-18 21-56-307.jpg

      166,19 kB, 1.416×848, 19 mal angesehen
    1. Verweis = DLL oder andere Lib einbinden und so deren Funktionen, Klassen, ... verfügbar machen.
    2. Damit man nicht immer Windows.Forms.TextBox schreiben muss, kann man den Namespace per Imports Windows.Forms bekannt machen und muss zukünftig nur TextBox schreiben.
    3. Wenn Dir eine Einzelinstanz auf dem PC reicht, dann: Projekteigenschaften -> Anwendung -> [x] Einzelinstanzanwendung erstellen
    4. sicher, dass getLocalProcessOwner ne .Net-Funktion ist? Ich hab die nur im Eigenbau hier und hier gefunden.
    • meine wichtigste Programmiererkenntnis: Mühsam erhängt sich das Eichhörnchen.
    • eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    • »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder, wenn es kein Besteck mehr gibt, zumindest Glasnudeln.«

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    ... oder das Anwendungsframework:


    Aber um auf das Problem einzugehen:
    Wie VaporiZed bereits erwähnt hat: Es handelt sich sicher nicht um eine Funktion im .NET Framework. Methodennamen werden in .NET immer großgeschrieben, das ist ein weiteres Indiz dafür.
    Beachte bei "aber Imports System.Management wird als "nicht verwendet" dargestellt und die Funktion getLocalProcessOwner wird (folgerichtig) nicht gefunden": System.Management ist ein Namespace, und in einem Namespace können sich nur Typen, nicht aber Methoden befinden. Allerhöchstens ein VB-Modul hätte importiert werden können, aber laut MSDN beinhaltet der System.Management-Namespace keines. Deshalb solltest Du nicht erwarten, dass durch diesen Import eine Methode (eben die getLocalProcessOwner-Methode) gefunden werden kann.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Jou.
    @Peter329 Wenn Du das über Mutex machen willst, musst Du das VB-AnwendungsFramework ausschalten und Dein Programm über die Datei Program.vb starten.
    In den Projekteigenschaften musst Du dann die Prozerur Main als Startprozedur eintragen.
    Ich hab hier nur ne CS-Variante rumliegen, aber die lässt sich vom Automaten nach VB übersetzen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. using System;
    2. using System.Threading;
    3. using System.Windows.Forms;
    4. namespace Test
    5. {
    6. static class Program
    7. {
    8. /// <summary>
    9. /// The main entry point for the application.
    10. /// </summary>
    11. [STAThread]
    12. static void Main()
    13. {
    14. bool firstInstance = false;
    15. Mutex mtx = new Mutex(true, "QWERTZ", out firstInstance); // eine Bezeichnung halt
    16. if (firstInstance)
    17. {
    18. Application.EnableVisualStyles();
    19. Application.SetCompatibleTextRenderingDefault(false);
    20. Application.Run(new Form1()); // Hier wird Form1 als MainForm gestartet
    21. }
    22. else
    23. {
    24. // Send argument to running window
    25. Form1.HandleCmdLineArgs(); // statische / Shared Funktion, die die neue Kommandozeile auslesen lässt
    26. }
    27. }
    28. }
    29. }
    In HandleCmdLineArgs kannst Du Dir über Application.OpenForms[0] die Instanz des Hauptfensters holen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hi,

    erst mal Danke für die Hinweise.

    Spät kam die Einsicht, doch sie kam !

    Ich war einfach zu sehr fixiert darauf, dass ich irgend etwas mit dem Import und dem Verweis falsch mache. Dabei sind diese Dinge vollkommen in Ordnung.

    Nach euren Hinweisen habe ich mir das Projekt, wo das Dingens funktioniert, noch mal genauer angesehen und die Funktion GetLocalProcessOwner im ObjectExplorer gesucht. Und natürlich nicht gefunden. Weil es eine User Function ist:

    VB.NET-Quellcode

    1. <DebuggerStepThrough()>
    2. Private Function GetLocalProcessOwner(ByVal pid As Integer) As String
    3. Dim ProcessOwner As String = ""
    4. Dim x As New ObjectQuery("Select * From Win32_Process where Handle='" & pid & "'")
    5. Dim mos As New ManagementObjectSearcher(x)
    6. For Each mo As ManagementObject In mos.[Get]()
    7. Dim s As String() = New String(1) {}
    8. mo.InvokeMethod("GetOwner", DirectCast(s, Object()))
    9. If s(0) Is Nothing Then Return "???"
    10. ProcessOwner = s(0).ToString()
    11. Exit For
    12. Next
    13. Return ProcessOwner
    14. End Function


    Der Import und Verweis sind notwendig, weil sonst die Managment Objects nicht gefunden werden. Jetzt ist mir klar wie der Hase läuft.

    Und nun funktioniert die Prüfung, ob die Instanz schon gestartet ist, fehlerfrei ! Mein Tag ist gerettet!

    Danke noch einmal an die Ratgeber, Daumen hoch und Problem gelöst !

    LG
    Peter