Willkommen bei Entwickler-Forum.
Seite 2 von 2 ErsteErste 1 2
Ergebnis 11 bis 15 von 15
  1. #11
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.783

    Standard

    Ich weiß nur nicht, wie ich das Problem noch beschreiben soll, weil ich finde, dass es ziemlich eindeutig ist.
    Ich nutze die Schnittstelle der WaWi an der Stelle also nur, um eigene Formulare zu starten, damit die User alles an einer Stelle verwalten können.
    So selten ist die Vorgehensweise eigentlich nicht, denke ich...
    Entweder so ein Produkt hat eine Schnittstelle (REST, SOAP) wo man Daten in einem serialisierbaren Format bekommt oder sie bieten eine Plugin Schnittstelle wo man dann im Prozessraum der Anwendung jeden eigenen Code ausführen kann. Eine Umgebung in der ein bisschen .Net geht ist alles andere als was eindeutiges oder übliches. Aber letztlich bin ich nur neugierig und dein Problem ist dein Problem Du musst das nicht verteidigen.

    Weil ich an der Stelle kein Objekt meiner der Form habe!
    Reflection benutzen?

    Code C:
    var assembly = Assembly.LoadFile(@"C:\MeineLiebeProduktErweiterungen\MeinLiebeDll.dll");
    var type = assembly.GetType("meinLíeberNamespace.meineLiebeForm");
    var form = (Form)Activator.CreateInstance(type);
    form.ShowDialog();  // oder form.Show() oder falls keine Messageschleife läuft stattdessen hier Application.Run(form) benutzen.

    Falls es eine DevEx Form ist die nicht im Framework definiert ist dann einen statischen Einsprungspunkt (wie z.B. die übliche Main Methode) definieren und denn per Reflection aufrufen. Falls der Call häufig passiert dann kann man auch dynamisch Code erzeugen(siehe DynamicMethod im System.Reflection.Emit Namespace). Es läuft immer darauf hinaus das du keine Referenz auf irgendwas zwingend brauchst du kannst dir das auch zur Laufzeit holen.
    Letztlich kenne ich zuwenig Details deiner Umgebung um dein Vorgehen zu verstehen und was passendes (anstatt nur was anderes ) vorzuschlagen. Ich habe mich nur gewundert.

  2. #12
    Stammgast
    Registriert seit
    03.03.2007
    Ort
    Schleswig-Holstein
    Beiträge
    315

    Standard

    Hi Ralf,

    Wie ich vermutet habe, weißt Du wie immer mehr.

    Mit der Reflection funktioniert der Aufruf auch, danke für den Tipp.
    Mir stellen sich allerdings an der Stelle wieder zwei Fragen


    1. Wie "entleere" ich die Assembly?
    Wenn ich den Weg über die Reflection nutze, öffnet sich das Formular, wie es soll. ich kann darin arbeiten, soweit passt alles.
    Nachdem das Formular allerdings einmal geöffnet wurde, kann ich das Visual Studio Project nicht mehr anpassen. Beim Erstellen des Build meldet er mir, dass der Instanzverweis von einem anderen Programm genutzt wird.
    Innerhalb meiner Form nutze ich zum Schließen diesen Code:
    Code C#:
    Form1.Close();
    Application.Exit();
    Beim Schließen bekomme ich übrigens einen Fehler, dass eine Methode nicht auf ein Objektverweis angewendet wurde.
    Das ist meines Erachtens die zweite Zeile, die ich dann auskommentiert habe. Nun kann ich den Build allerdings nicht mehr erstellen, solange die Warenwirtschaft noch offen ist.
    Innerhalb der Warenwirtschaft habe ich versucht, das Form Objekt ebenfalls zu schließe, was aber leider nichts an der Problem ändert:
    Code C#:
    oForm.Close();
    oForm.Dispose();


    2. Wie bringt mich das in meiner Ausgangsproblematik weiter?
    Ich kann jetzt das Formular über eine Reflection aufrufen, schön. Aber die Ausgangsfrage bleibt, wie ich darin jetzt auf das Mandanten-Objekt der Warenwirtschaft zugreifen kann?
    Das ist mir leider noch nicht ganz klar. Denn in dem Scope der Form ist diese ja weiterhin nicht vorhanden. Oder habe ich jetzt eine bessere Möglichkeit, der Assembly dieses Objekt bekannt zu machen?


    Danke für Deine Tipps!
    Gruß Arne
    PHP rocks!
    Eine Initiative der PHP Community

  3. #13
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.783

    Standard

    1. Wie "entleere" ich die Assembly?
    AppDomains benutzen. Das Thema ist aber eher was dem man sich nicht freiwillig nähert. Da würde ich dann, wenn es ein wichtiges Feature ist die Assembly ohne Prozess-Neustart austauschen zu könen und nicht einfach nur beim entwickeln stört, auch eher auf multiple Prozesse setzen. Selbst Microsoft sucht mittlerweile andere Lösungen (in .Net Core gibt es den AssemblyLoadContext anstat AppDomains).

    2. Wie bringt mich das in meiner Ausgangsproblematik weiter?
    Nun ja der Typ für dein Mandanten muss ja irgendwo definiert sein. Der taucht nicht irgendwie magisch in dem Context auf wo du Zugriff auf ihn hast. Die Assembly die den Typ definiert solltest du doch auch von deiner Assembly in dem deine Form definiert ist referenzieren können. Wenn nicht wird deine Umgebung noch merkwürdiger. Oder du hast uns verschwiegen das die Wawi gar keine .Net Anwendung ist und der Context auch nix mit .Net zu tun hat sondern etwas COM basiertes ist und du heftig an Interop Typen arbeitest.

    Wenn du den Typ referenzieren kannst dann gibt deiner Form eine Methode/Property dem du die Instanz mitgeben kannst. Da du deine Form nur als Form ansprechen kannst und nicht als konkreten Typen musst du hier dann wieder Reflection anwenden.

    Im Falle einer Property wie folgt (Property sollte logischerweise nicht statisch, public mit setter sein)
    Code C:
    var propertyInfo = oForm.GetType().GetProperty("meineLiebeProperty");
    propertyInfo.SetValue(oForm, meinLiebesMandantenObject);

  4. #14
    Stammgast
    Registriert seit
    03.03.2007
    Ort
    Schleswig-Holstein
    Beiträge
    315

    Standard

    Oder du hast uns verschwiegen das die Wawi gar keine .Net Anwendung ist und der Context auch nix mit .Net zu tun hat sondern etwas COM basiertes ist und du heftig an Interop Typen arbeitest.
    Ich denke, das ist entscheidend.
    Das habe ich sicher nicht absichtlich vorenthalten, sorry. Hatte gar nicht daran gedacht, gut dass Dir die Idee kam.

    Es läuft tatsächlich COM basiert, daher gibt es auch in den möglichen Funktionen, wo ich in C# verwenden darf/kann auch oft Probleme mit der Wandlung von COM- zu .NET-Objekten.

    Der property-Gedanke ist allerdings interessant, wenn es zu 1. eine sinnvolle Lösung gäbe. AppDomains ist hier denke ich fehl am Platz.
    Das ganze läuft über Process.Start() wesentlich unkomplizierter. Kann ich dort auch eine Property nicht auch in einer ähnlichen Form, wie bei der Reflection übergeben?

    Danke für Deine ausführlichen Hinweise.
    Gruß Arne
    PHP rocks!
    Eine Initiative der PHP Community

  5. #15
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.783

    Standard

    Code C:
    Kann ich dort auch eine Property nicht auch in einer ähnlichen Form, wie bei der Reflection übergeben?

    Nein. Da ist dann eine Prozessgrenze dazwischen und du landest bei irgendeinen IPC Mechanismus.

 

 
Seite 2 von 2 ErsteErste 1 2

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •