In Assembly eine Methode aus einer anderen Assembly aufrufen



  • Hallo,

    ich habe ein Problem mit Assemblies und schildere als erstes die Situation:
    Es gibt ein Hauptprogramm und 2 Assemblies die zur Laufzeit mit folgendem Code geladen werden. (hier für ein Assembly beispielhaft, da die zweite Assembly laden analog erfolgt)

    String^ Exepath;
    String^ DLLPath;
    System::Object^ ob;
    Exepath = Application::StartupPath;
    if (System::IO::File::Exists(Exepath + "//HalconBVAssembly.dll") == true)
    {
        try
          {
    	 DLLPath=Exepath + "\\HalconBVAssembly.dll";
    	 Assembly^ a = Assembly::LoadFrom(DLLPath);
    
             Type^ type = a->GetType("HalconBVAssembly.HalconBV");
             if (a->GetType("HalconBVAssembly.HalconBV") != nullptr)
             {
    	     ob = Activator::CreateInstance(type);
    	     BV_Form = safe_cast<Form^>(ob);
    
    	     BV_Form->Show();    
             }
    
         }
         catch (System::IO::IOException^ ioe)
         {										 
            StatusLabel->ForeColor=System::Drawing::Color::Red;
    	StatusLabel->Text="Fehler beim Laden des Halcon BV-Moduls.";
         }
    }
    

    Dies Funktioniert einwandfrei und die Formen der beiden Assembly werden angezeigt. Nun wird in der Assembly A innerhalb der Form-Klasse eine public Methode definiert. Die Assembly B soll nun die Methode der Assembly A ausführen können.
    Dazu habe ich folgenden Code geschrieben (Assembly in c#):

    DLLPath=Exepath + "\\HalconBVAssembly.dll";
    Assembly a = Assembly.LoadFrom(DLLPath);
    
    Type type = a.GetType("HalconBVAssembly.HalconBV");
    if (a.GetType("HalconBVAssembly.HalconBV") != null)
    {
       ob = Activator.CreateInstance(type);
    
       //BV_Form = ob as Form;
       //BV_Form.Show();  
    
       MethodInfo fnInfo = type.GetMethod("RunHDevFile");
       fnInfo.Invoke(ob, null);
    }
    

    Die Methode wird auch aufgerufen und man kann mit dem Debugger reingehen, jedoch fällt dann auf, das von der Form der Assembly A die Komponenten nicht initialisiert sind, und auf die werden innerhalb der Methode zugegriffen.Es folgt eine Exception....
    Meine Frage ist nun, wie kann man einer Assembly sagen, dass die Form einer anderern Assembly bereits geladen und angezeigt wird, ich denke es ist unnötig eine weitere Instanz zu erstellen oder? Und wie kann man dann aus der Assembly B eine Methode der Form aus Assembly A aufrufen, so dass diese auch auf die anderen Komponenten der Form zugegreifen kann.

    Vielen Dank im Voraus für die Ratschläge!!



  • Du musst halt die Instanz übergeben... oder Dir "globale" (statisch) merken...



  • Danke für Deinen Ratschlag, habe nur etwas gedankliche Schwierigkeiten mit der Umsetzung. Könnte es wohl funktionieren wenn ich in der einen Assembly eine get-Methode schreibe die als Rückgabewert einen Pointer auf die Form erwartet? Diese Methode dann vom Hauptprogramm aus aufrufen und die Instanz der anderen Form (oder Pointer) mitliefern...
    Bin mir da absolut unsicher da der Umgang mit Assemblies Neuland für mich ist.



  • Warum bindest Du die Assembly nicht direkt ein? Warum mit Reflection?

    Du musst Dir halt in irgendeiner statischen Klasse die Instanz merken, wenn es schon eine gibt.



  • Also die Assemblies binde ich nicht direkt ein, weil das ganze Programm modular aufgebaut sein soll, also wenn eine bestimmte Assembly fehlt, dann wird das Programm einfach ohne die entsprechende Funktionalität gestartet.

    Also eine Instanz der Form der geladenen Assembly A und auch der Assembly B gibt es schon im Hauptprogramm. Um nun von der Assembly B auf die Form der Assembly A zugreifen zu können brauche ich ne statische Klasse mit der ensprechenden Instanz oder wie meinst du das?
    Es wäre super nett wenn du das mal mit ein paar Codezeilen näher erklären könntest, denn ich wüsste nicht wie ich Dein Vorschlag jetzt umsetzen sollte.



  • C#:

    public class FormA
    {
      static FormA()
      {
        _Instance = new FormA();
      }
    
      static FormA _Instance;
      public static FormA Instance
      {
        get { return _Instance; }
      }
    };
    


  • Vielen Dank Jochen, lese mich noch mal richtig in das Thema Assemblies ein mit einem guten Buch 😉 Wenn ich die Antwort habe werde ich sie hier natürlich reinschreiben. Bis dahin viele Grüße!


Anmelden zum Antworten