2009-08-08 8 views
0

Je souhaite qu'un objet de classe .NET soit utilisé par plusieurs processus sur le même ordinateur.Limitation de la classe .NET à une instance d'objet unique sur la frontière de l'ordinateur => "singleton inter-processus"

Avec des domaines d'application, il n'est pas facile de se déplacer sur cette frontière, mais les fichiers mappés en mémoire dans .NET 4.0 devraient faciliter cette tâche d'une certaine manière. Jusqu'à ce que .NET 4.0 soit disponible en version finale ... Est-il possible de créer une sorte de "singleton inter-processus" en C#?

Répondre

4

Oui, vous pouvez créer un .Net Remoting singleton dans un processus, et l'exposer aux autres processus en cours d'exécution sur la même machine via Remoting ...

EDIT: en 2.x .Net, vous devez utiliser une solution Remoting, mais dans 3.x .Net ou version ultérieure (lequelR WCF est disponible) ce même funcctionality peut être disponible en utilisant WCF (Check it out) ...

+0

Cela devrait être fait via WCF, et non Remoting. Remoting a été déprécié en faveur de WCF. –

+0

@John, Merci, je l'avoue Je ne suis pas aussi familier avec les détails de WCF que je devrais être ... où j'ai travaillé, je suis juste en mesure d'utiliser CLR 3.x ou WCF stuff .. en savoir plus sur maintenant –

+0

Avec les exigences telles que données, je ne pense pas que ce soit faisable via WCF. .NET Remoting s'assurera que l'identité de l'objet est préservée à tout moment, contrairement à WCF. En outre, la "dépréciation" de Remoting devrait être prise avec un grain de sel - c'est simplement une technologie très différente de la WCF dans ses principes de conception, et en tant que tel, il y a des situations où l'un ou l'autre fait simplement mieux. –

2

Vous pouvez utiliser mutex global.

Threading in C# a un bon exemple (copié ci-dessous pour plus de commodité) sur la façon d'utiliser mutex nommé pour enusure qu'une seule instance d'une application peut fonctionner sur une machine.

Vous pouvez développer cet exemple pour garantir qu'il n'y a qu'une seule instance d'un objet.

class OneAtATimePlease { 
    // Use a name unique to the application (eg include your company URL) 
    static Mutex mutex = new Mutex (false, "oreilly.com OneAtATimeDemo"); 

    static void Main() { 
    // Wait 5 seconds if contended – in case another instance 
    // of the program is in the process of shutting down. 

    if (!mutex.WaitOne (TimeSpan.FromSeconds (5), false)) { 
     Console.WriteLine ("Another instance of the app is running. Bye!"); 
     return; 
    } 
    try { 
     Console.WriteLine ("Running - press Enter to exit"); 
     Console.ReadLine(); 
    } 
    finally { mutex.ReleaseMutex(); } 
    } 
} 

Il y a encore une chose à laquelle vous devez faire attention.

Lorsque en utilisant mutex nommé sur un serveur qui exécute dans les services terminaux, un mutex nommé peut avoir deux niveaux de visibilité, mondiale à toutes les sessions (nom préfixé avec « Global\ ») ou local à la session du serveur terminal (nom préfixé par "Local\", ce sera par défaut si aucun préfixe n'est spécifié).

Vous pouvez trouver plus de détails sur Mutex dans MSDN: Mutex Class.

+0

ce code empêche le deuxième processus de créer un nouvel objet, mais ne lui donne pas de référence à celui qui existe déjà. Toute solution pour cela? Aussi, merci pour votre temps ... – Jox

+0

Je recommanderais WCF pour la communication inter-processus. En général, NetNamedPipeBinding est un bon choix pour la communication inter-processus dans une machine. –

0

Installez votre DLL .net dans le cache de l'assembly global. Ensuite, il peut être référencé par n'importe quelle application sur l'ordinateur.

+0

Bien sûr qu'il veut dire l'instance et non la définition. –

+0

Exactement, j'ai besoin de plus de processus pour utiliser le même * objet *, pas la même classe. – Jox