2010-06-02 14 views
6

Ich habe zwei verschiedene C# -Anwendungen, die gleichzeitig ausgeführt werden.Können dieselben DLL-Daten von zwei verschiedenen Prozessen gemeinsam genutzt werden?

Ich möchte, dass beide auf die gleiche "Instanz" einer DLL (auch in C#) zugreifen können.

Die DLL enthält einige Daten, die ich zurückgeben möchte, für welche der beiden Anwendungen es auch immer benötigt.

Meine DLL ist Thread-Safe, also hatte ich gehofft, dass dies möglich wäre, aber ich bin mir nicht sicher, wie.

Jede Hilfe oder Beratung wäre sehr willkommen.

+2

Eine DLL ist einfach eine Sammlung von linearen Daten und Code, d. H. Nicht strukturiert wie "Objekte" sind in C#. Wie kann eine DLL eine Instanz sein? Wenn Sie Code- und Datenfreigabe meinen; Dies ist abhängig vom Betriebssystem. – Pindatjuh

Antwort

5

Der Prozessraum ist unterschiedlich, so dass beispielsweise globale Variablen in der DLL für jeden einzelnen Prozess spezifisch sind. Es ist möglich, dass der Code im Speicher freigegeben wird (Windows verwendet normalerweise die Referenzzählung, um diesen Teil effizienter zu machen).

Wenn Sie Informationen teilen möchten, auf die in der DLL zwischen den beiden Prozessen zugegriffen wird, dann scheint es wahrscheinlich, dass es erforderlich ist, eine Art von IPC (Interprozesskommunikation) Mechanismus wie Sockets, Shared Memory, Pipes zu verwenden usw.

+0

Sie meinen also, dass beide geladene DLLs miteinander kommunizieren, sagen wir, Named Pipes? –

+0

@Jelly Amma: Sie könnten miteinander über Pipes reden, wenn Sie es implementieren. Es ist nicht automatisch, wenn Sie das fragen. –

0

Eine DLL hat keine Instanz, sie wird in einen Host-Prozess geladen. Verweisen Sie die Assembly in beiden Anwendungen und verwenden Sie ihre Klassen/Methoden.

Wenn Sie die Bereitstellung der gleichen Baugruppe für beide Anwendungen vermeiden möchten, können Sie put it in the GAC.

0

Es ist möglich. Sie können die DLL im GAC installieren (erfordert stark benannte Assemblys), damit beide Anwendungen problemlos darauf zugreifen können.

Oder kleben Sie es in einen Ordner und beide Apps suchen diesen Ordner für die DLL.

MSDN support article

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="MyAssembly2" culture="neutral" publicKeyToken="307041694a995978"/> 
      <codeBase version="1.0.1524.23149" href="FILE://C:/Myassemblies/MyAssembly2.dll"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 
0

Ich weiß nicht, ob dies in C#, aber in C++ durchgeführt werden kann Sie auch Shared Memory Abschnitte verwenden können, wenn die Informationen nicht zu kompliziert zu teilen. Sie würden einfach Zugriff auf diese Ressource zum Beispiel

Ein guter Artikel über das Thema ein Mutex mit synchronisieren müssen: http://www.codeproject.com/KB/threads/SharedMemory_IPC_Threads.aspx

Viel Spaß

0

Wenn Ihre DLL erstellt einen Namen MemoryMappedFile (im internen Speicher oder auf der Festplatte) dann können die zwei Anwendungen den von der DLL erstellten Speicher teilen. Jede Anwendung hat einen anderen Zeiger auf den gemeinsamen Speicher, aber der Speicher wird tatsächlich geteilt. Sie müssen den gleichen Namen für den gemeinsamen Speicher verwenden, und Sie sind selbständig, da zwischen den Prozessen Thread-sicher ist. (Benannte Semaphore oder Mutexe funktionieren, CriticalSection nicht.)