2009-05-21 2 views
0

Ich habe eine Anwendung, die aus einem Windows-Formular-Projekt und einem Klassenbibliothek-Projekt besteht. Wenn es gestartet wird, legt die ausführbare Datei einen statischen Wert in der DLL fest.Wie kann ich auf eine laufende Instanz einer eigenständigen .NET-Datei von einer .NET Dll oder Exe zugreifen?

using MyClassLibrary; 
namespace MyExeApplication 
{ 
    public partial class MainForm : Form 
    { 
     Hashtable ht = null; 
     void Form_Load(...) 
     { 
      ht = new Hashtable(); 
      ht.add("1", "Open"); 
      ht.add("2", "Close"); 
      Calculate.BasicValues = ht; 
     } 
     public Hashtable GetBasicValues() 
     { 
      return ht; 
     } 
    } 

}  
namespace MyClassLibrary 
{ 
    public class Calculate() 
    { 
     public static Hashtable BasicValues {get; set;} 
    } 
} 

Nun angenommen, die Anwendung läuft im Speicher (die ausführbare Datei). Mein Zweck ist es, eine andere eigenständige Anwendung zu erstellen und den Wert BasicValues ​​in der Funktion Calculate in der Klassenbibliothek zu verwenden.

using MyClassLibrary; 
namespace TestApplication 
{ 
    public partial class MainForm : Form 
    { 
    private void TestValueFromDll() 
    { 
      System.Windows.Forms.MessageBox.Show("Values of Hashtable"); 
      Hashtable ht = Calculate.BasicValues; 
      //The hashtable is null and values are not there 
      //The above will not work. Could I say something like 
      //Get the running instance of MyExeApplication 
      //and invoke GetBasicValues() ?     
    } 
    } 
} 

Ich denke, es funktioniert nicht, weil meine Testapplication die MyClassLibrary.dll in den Papierkorb-Ordner kopiert hat, in dem sich die ausführbare TestApplication.exe befindet. Daher wurde eine andere DLL verwendet (nicht die DLL, die von der ersten Anwendung MyExeApplication verwendet wurde).

Und meine Frage ist, wie kann ich dieses Problem lösen? Ist es möglich, Reflection zu verwenden und die Instanz von MyExeApplication abzurufen und die Werte von dort zu lesen? Gibt es einen anderen Weg?

Danke

Antwort

0

Wenn Sie Testapplication, MyExeApplication und MyClassLibrary in demselben Ordner (Einstellung der Ausgabeordner in den Eigenschaften-Menü Projekte) bauen, ich Sie Reflexion verwenden kann sich vorstellen würde vermeiden. Außerdem bin ich neugierig, warum Sie so etwas tun müssen? Ist BasicValues ​​etwas, das durch eine SQL-Tabelle oder sogar Registrierungseinstellungen ersetzt werden könnte?

Viel Glück!

1

Es kommt nicht darauf an, wo sich die DLL befindet. Es hört sich an, als ob das eigentliche Problem darin besteht, dass die DLL in die App-Domain "MyExeApplication" geladen wird und Sie Zugriff von der App-Domain "TestApplication" erhalten müssen. Und wie sich herausstellte, war .NET Remoting für die Kommunikation über App-Domains gedacht. Es gibt eine Reihe von Informationen darüber unter MSDN.

0

Es gibt keine Möglichkeit, dies zu tun, die mir bekannt ist, kurz vor dem Anschluss an den anderen Prozess als Debugger.

Ihre beste Option ist, dass die erste Anwendung die Hashtable in einem freigegebenen Speicherplatz speichert. Entweder als eine Datei auf der Festplatte, in einer Datenbank, mit einer Form von gemeinsam genutztem Speicher, oder Sie können sie mithilfe von Remoting weitergeben.

Welche Option Sie verwenden möchten, hängt wirklich davon ab, wie die Daten von jeder Anwendung verwendet werden.

0

Vielen Dank für die Antworten. Ich verwende derzeit die Registrierung als temporärer Speicher zum Speichern von Werten. Ich werde über Remoting und Anwendungsdomänen lesen und werde versuchen, dies zu tun.

Der Grund, ich will, ist, dass ich eine EXE-Anwendung im Hintergrund läuft (minimiert in Windows-Fach). Diese EXE-App fungiert als zentrale API und generiert einige Web-Login-Informationen, die für den Zugriff von jeder TestApplication verfügbar sein müssen, die MyClassLibrary.dll verwendet.

Wäre es gut, wenn ich den ganzen Code von meiner DLL-Klasse auf exe setze und dann nur noch eine ausführbare Datei habe, die alles hat?

Dann in MyTestApplication könnte ich einen Verweis auf exe hinzufügen. Aber ich hätte immer noch das selbe Problem. Weil, wenn ich eine andere Anwendung erstellen möchte, die Integration mit exe API, z. MyTestApplication2 und einen Verweis auf exe hinzufügen würde ich immer noch das gleiche Problem haben?

Ich denke, das ist aus der Reflexion nicht möglich. Aber in VB6 könnte man etwas wie Objekt o = GetObject (, "MyExeApplication.Class") sagen und dann könnte ich o.GetBasicValues ​​() sagen.

+0

Ich wollte etwas wie die COM aus dem Prozess-Server, wie Sie mit VB 6 sprechen. Leider hat .NET keinen äquivalenten Mechanismus. Es gibt Remoting, aber es ist nicht annähernd so einfach und einfach zu bedienen. –

Verwandte Themen