2009-03-25 66 views
0

Ich verwende die Process-Klasse in meiner Anwendung, gleich zu Beginn der statischen Hauptmethode. Ich verwende die Process-Klasse, um zu wissen, ob derzeit eine andere Instanz meiner Anwendung ausgeführt wird. Wenn meine Anwendung bereits ausgeführt wird, werde ich beenden. Ich bin nicht auf der Suche nach einer Möglichkeit, dies zu ändern, das seit Jahren funktioniertProzessklasse und .NET-Sicherheit?

Aber vor kurzem funktioniert das nicht auf einigen Computern unserer Benutzer, bekomme ich den Fehler "Common Language Runtime Debugging Services: Anwendung hat generiert Ausnahme, die nicht bearbeitet werden konnte ".

Ich bereits Vollversammlung die Baugruppe und der Benutzer ist ein Administrator des Systems.

alle Ideen helfen Ihnen Danke !!

Bearbeiten: Der WMI-Performance-Adapter-Dienst wird eingeschaltet, bevor der Fehler ausgelöst wird, und AUS, nachdem der Fehler aufgetreten ist, fehlt mir eine Art von Berechtigung ?.

dies auf Framework 1.1

+0

@Oscar: Was lässt Sie glauben, dass das Problem sicherheitsbezogen ist? – Brann

+0

ich denke, dass die WMI vielleicht beklagte –

Antwort

1

Könnten Sie einen Top-Level-Try-Catch hinzufügen (oder die UnhandledException Handler), um zu sehen, was kinf von Exception geworfen wird? Dies wäre eine große Hilfe.

4

Während ich kann nicht darüber spekulieren, warum Ihr Prozess abstürzt, eine bessere Lösung wäre, einen benannten Mutex zu verwenden:

static void Main() 
{ 
    bool mutexWasCreated; 
    using (Mutex mutex=new Mutex(true, AppID, out mutexWasCreated)) 
    { 
    // check for single instance 
    if (!mutexWasCreated) 
     return; 

    Application.Run(...); 
    } 
} 
+0

ich bin nicht auf der Suche nach einer Möglichkeit, dies zu ändern, dies funktioniert seit Jahren, ich bin curiuos, warum Prozess kann eine Sicherheit auslösen Ausnahme, Danke –

+0

@Oscar: woher wissen Sie, dass es ist eine Sicherheitsausnahme? – Brann

+0

Ehrlich gesagt stimme ich Chris zu. Du machst es falsch. Behebe das Problem im Herzen und du musst dir keine Sorgen machen. Sie müssen auch keine Vertrauensstellungen und Berechtigungen ändern, um sie auszuführen. – Ian

0

ich die Klasse Prozess verwende, wenn eine andere Instanz von meiner Anwendung zu wissen ist, momentan laufend.

.Net stellt das Anwendungsereignis StartupNextInstance für diesen Zweck bereit.

Hmm ... macht nichts. Dies scheint nur in Visual Basic verfügbar zu sein. Ich lasse die Antwort hier für den Fall, dass es für jemand anderen nützlich ist.

+0

Dies ist nur für .net 2.0 und höher diese App wurde in 1.1 erstellt –

+0

VisualBasic.ApplicationServices scheint Art schlecht unterstützt. Und wenn Sie Windows Logo Zertifizierung benötigen, sollten Sie es vergessen. Siehe die Kommentare hier: http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx –

1

Ich stimme Brann zu. Es ist schwer zu beheben, wenn Sie nicht wissen, welche Ausnahme ausgelöst wird. Ich würde auf die unhandledexception event hören und das Problem als ersten Schritt bei der Fehlersuche protokollieren.

1

Ich erinnere mich an ein ähnliches Problem mit einigen. NET-Code, an dem ich arbeitete. Es war in einer Citrix-Umgebung.

Der Benutzer musste Mitglied der Performance-Gruppe sein, glaube ich, um Process.GetProcessesByName() ausführen zu können ... Das ist wirklich nicht wünschenswert!

Ich denke, wir hatten zwei Work arounds - der erste war am Anfang des Codes, und das war der Code aus einem VB-Skript ausführen, die getestet, ob der Code bereits ausgeführt wurde oder nicht.

Die zweite Arbeit war Teil des Codes, der den Fokus des Fensters festlegte. Hier führen wir AppActivate() innerhalb eines try/catch-Blocks aus - was vermutlich möglich ist - wenn AppActivate fehlschlägt, müssen Sie die Anwendung ausführen.

Hoffe, das hilft!

+0

Dies erscheint ein Pfad zum eigentlichen Problem (GetProcessesByName()) danke !!! –