Kann eine Singleton-Klasse in eine DLL freigegeben werden Prozesse?
Ich bin erstellen einer benutzerdefinierten .net hardware-Frameworks, die verwendet werden von anderen Programmierern, um die Kontrolle über einige hardware. Sie fügen Sie einen Verweis auf unsere DLL zu bekommen, um unsere hardware-framework. Ich bin in der Notwendigkeit einer gemeinsamen Klasse, die Zugriff wird von mehreren Anwendungen (Prozesse).
Das singleton-Muster zu sein scheint, was ich brauche, aber es funktioniert nur für mehrere threads in einem Prozess. Ich konnte völlig falsch, aber hier ist ein Beispiel der C# - code, den ich derzeit habe. Ich kann mir nicht helfen zu spüren, dass der Entwurf falsch ist. Ich wünschte, ich könnte mehr konkrete Informationen, aber ich kann nicht.
- Ich muss betonen, dass ich keinerlei Kontrolle über die Kunden-Anwendung. Die Lösung muss sein, die innerhalb der Rahmen (DLL) selbst.
Rahmen: (Shared DLL)
public class Resources
{
static readonly Resources m_instance = new Resources();
public string Data;
private Resources()
{
Data = DateTime.Now.ToString();
}
public static Resources Instance
{
get
{
return m_instance;
}
}
}
Die Test-Anwendung: (eventuell Kunden-app)
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Press enter to capture the resource!");
Console.ReadLine();
var resources = Resources.Instance;
Console.WriteLine("\r\n{0}: {1}\r\n", Thread.CurrentThread.ManagedThreadId, resources.Data);
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += WorkerDoWork;
worker.RunWorkerAsync();
while (worker.IsBusy)
{
Thread.Sleep(100);
}
Console.WriteLine("Press enter to close the process!");
Console.ReadLine();
}
static void WorkerDoWork(object sender, DoWorkEventArgs e)
{
var resources = Resources.Instance;
Console.WriteLine("\r\n{0}: {1}\r\n", Thread.CurrentThread.ManagedThreadId, resources.Data);
}
}
Die erste gestartete Anwendung gibt eine Leistung von:
Drücken Sie die EINGABETASTE, um zu erfassen die Ressource!
1: 6/24/2009 8:27:34 UHR
3: 6/24/2009 8:27:34 UHR
Drücken Sie die EINGABETASTE, um den Prozess zu beenden!
Die zweite Anwendung ergibt eine Leistung von:
Drücken Sie die EINGABETASTE, um zu erfassen die Ressource!
9: 6/24/2009 8:27:35 UHR
10: 6/24/2009 8:27:35 UHR
Drücken Sie die EINGABETASTE, um den Prozess zu beenden!
Abschluss:
Ich würde gerne sehen, beide Anwendungen dieselbe Zeichenfolge zurück an die Zeit der ersten Instanziierung der Klasse.
Wie Sie sehen können die singleton arbeitet für die mehrere Threads innerhalb des Prozesses, aber nicht cross-Prozesse. Vielleicht kann dies nicht getan werden, denn ich kann nicht scheinen zu finden, keine Lösung.
InformationsquelleAutor Bobby Cannon | 2009-06-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Man nicht mit einem singleton-Synchronisierung zwischen Anwendungen. Jeder wird in seiner Anwendung Raum, und als eine Angelegenheit von Sicherheit kann nicht auf den Speicher zugreifen/Objekte/etc. von den anderen, ohne eine Methode der Kommunikation (wie remoting) Zu synchronisieren, die beiden hätten Sie zu remote auf einem Dritten Programm.
das ist die exakt gleiche Frage - womit es in GAC tut nichts besonderes, es ist noch eine dll!
InformationsquelleAutor kemiller2002
Ja, es ist möglich, zu teilen ein singleton unter mehreren Prozessen. Allerdings müssen Sie, um die Vorteile einer Technologie unterstützt, die die prozessübergreifenden Kommunikation, um dieses Ziel zu erreichen.
Den beliebtesten Technologien, mit denen Sie Sie teilen Ihr Objekt ziemlich direkt sind, Remoting und WCF.
Geben ein Beispiel von teilen eines singleton mit dieser über den Rahmen eines SO beantworten. Aber es gibt viele tutorials im web für jeden dieser. Googeln entweder Technologie plus singleton, sollten Sie auf dem richtigen Weg.
InformationsquelleAutor JaredPar
Hinzufügen, um die Kevin ' s Antworten, Ihr Konstruktor für die Klasse Ressourcen sollten wirklich privat, denn es ist ein wahrer singleton, sonst ist nichts zu stoppen jemand aus dem erstellen einer neuen Instanz der Ressourcen-Klasse über den Konstruktor übergeben. Dies nicht Ihr problem lösen, aber es muss aufhören, einen von Missbrauch der Singleton.
Dies ist nur ein Beispiel. Ich bin nicht versuchen, Ihnen ein Datum. Ich bin versucht, um die Kontrolle über eine hardware-Ressource.
Eine Datei in diesem Fall wird nicht gut sein. Mein Fehler.
InformationsquelleAutor AlbertoPL
Einfach anrufen, eine singleton-Eigenschaft in eine andere Baugruppe, die aus zwei verschiedenen Prozessen schaffen unterschiedliche Instanzen dieser Klasse.
Aber Sie können leicht zu teilen Informationen zwischen Prozessen mit .Net Remoting, Feuer-oder prozessübergreifende Ereignisse, wenn Sie nur die einfache Signalisierung (EventWaitHandle).
[Edit:], Um es so Aussehen wie ein Singleton, um Ihre Anrufer, Sie können verfügbar machen eine Klasse, die intern mit Remoting zu instanziieren Sie ein singleton, und dann wieder die Instanz transparent. Hier ist ein Beispiel, das (glaube ich): http://www.codeproject.com/KB/dotnet/remotingsingleton.aspx
InformationsquelleAutor Groo
Gibt es Möglichkeiten, es zu tun, wie oben erwähnt. Aber es ist ungeschickt, wenn Sie die Verwendung von WCF oder remoting. Bitte versuchen Sie Interprozess-thread-sync-Techniken.
Für weitere Informationen Lesen Sie die online-kostenloses e-book auf dem Durchzug
http://www.albahari.com/threading/
Speziell finden Sie unter cross-Entwicklung sync-Konstrukte hier ...
http://www.albahari.com/threading/part2.aspx#_Synchronization_Essentials
InformationsquelleAutor Shafqat Ahmed