Alternative für Marshal.GetActiveObject

  • WPF

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von kaifreeman.

    Alternative für Marshal.GetActiveObject

    Hallo Leute,

    ich bin gerade dabei ein Projekt auf .net Core 3.1 zu migrieren (ich muss das leider tun weil ich das neue EF Core 5.0 nutzen will und das ist ja durch das geforderte Framework nicht mehr mit .net 4.7 kompatibel).

    Abgesehen davon das einen die Migration durch ein Tal der Tränen schickt bin ich jetzt von >3600 Fehlern auf 10 runter. Schaut also mal nicht so schlecht aus.
    Leider gibt es eine Funktion für die ich keine Alternative in .net Core 3.1 finde:

    VB.NET-Quellcode

    1. .OutlookApp = DirectCast(Marshal.GetActiveObject("Outlook.Application"), Outlook.Application)


    Wie der Name schon sagt habe ich bis dato mit der GetAvticeObject Methode eine bereits laufende Instanz von Outlook an mein Programm angebunden (um zu vermeiden das ich immer wieder eine neue Outlook Instanz für das Programm erzeuge).

    Leider kommt die Meldung:
    "GetActiveObject is not a Member of 'Marshal'"

    Ich habe im Internet schon recherchiert und es wird gesagt das die GetActiveObject, wie der Fehler besagt, nicht mehr im .Core Framework verfügbar ist.

    Ich bin bei meinen Recherchen auf diesen Beitrag gestoßen:
    stackoverflow.com/questions/64…ve-com-object-in-net-core

    Hier wird darauf verwiesen das man den Code einfach aus dem marshl.cs Repo einkopieren soll. Abgesehen davon das sich der Code nicht in VB.net übersetzten lässt verstehe ich auch nicht "wohin" dieser Code gehören sollte.
    Daher final die Frage, gibt es einen Weg in .net Core eine aktive Application Outlook, Word, Excel usw. abzufragen?

    Danke für eure Hilfe.
    mfG.
    Stephan

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „kaifreeman“ ()

    Ich habe auch so meine lieben Probleme mit Excel und Outlook, grade unter Core3.1 / NET5
    Allerdings arbeite ich mit den NuGet Paketen
    Microsoft.Office.Interop.Excel und
    Microsoft.Office.Interop.Outlook

    Bei der Migration nach Core3.1 bin ich auch Hinweise gestoßen, wie ich diese ins Projekt einbinde (DotNetZip und EPPlus bleiben weiterhin "normal" eingebunden):
    Projektdatei (csproj):
    <ItemGroup> <PackageReference Include="DotNetZip" Version="1.15.0" /> <PackageReference Include="EPPlus" Version="4.5.3.3" /> <Reference Include="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL"> <HintPath>..\packages\Microsoft.Office.Interop.Excel.15.0.4795.1000\lib\net20\Microsoft.Office.Interop.Excel.dll</HintPath> <EmbedInteropTypes>True</EmbedInteropTypes> </Reference> <Reference Include="Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL"> <HintPath>..\packages\Microsoft.Office.Interop.Outlook.15.0.4797.1003\lib\net20\Microsoft.Office.Interop.Outlook.dll</HintPath> <EmbedInteropTypes>True</EmbedInteropTypes> </Reference> </ItemGroup>

    C#-Quellcode

    1. using Outlook = Microsoft.Office.Interop.Outlook;
    2. ....
    3. // start outlook
    4. Outlook.Application outlookApplication = new Outlook.Application();
    5. // Create a new MailItem.
    6. Outlook.MailItem mailItem = (Outlook.MailItem)outlookApplication.CreateItem(Outlook.OlItemType.olMailItem);
    Hallo Dksksm,
    danke für deine Antwort. Leider hilft mir das nicht weiter, ich habe kein Problem mit der Erzeugung einer neuen Applikation.

    VB.NET-Quellcode

    1. .OutlookApp = New Outlook.Application()


    funktioniert bei mir ganz normal, ich habe einfach die DLLs eingebunden und gut ist. Das Problem ist bei mir die Marshal Klasse die früher nach aktiven COM Objekten gesucht hat.
    mfG.
    Stephan
    Hallo

    Ich hab mich ein wenig umgesehen und sehe da jetzt auch keinen vernünftigen Weg unter .Net Core/.Net 5. Ist einfach noch nicht drinnen.

    Falls jemand doch noch einen Weg finden sollte wäre das cool und würde mich auch interessieren, derweilen müsste man eben noch beim .Net Framework bleiben wenn man gewisse Klassen benötigt. Ist hald blöd wegen dem EF Core wobei man hier evtl. ne API zwischenhängen könnte, ist aber nicht sehr elegant und wieder mit viel Aufwand verbunden. Wofür benötigst du denn Word? Evtl. gibt es in diese Richtung eine bessere Lösung.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ich würde vermuten, dass das damit zusammenhängt, dass COM-Objekte was eigentlich Windows-spezifisches sind und Microsoft mit .NET Core versucht, möglichst nur plattformunabhängige Sachen einzubauen.
    Wobei man bei WPF und WinForms ja sowieso dann nur auf Windows setzt und in diese Bibliothek kann es ja ruig reinwandern.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Leute,

    ich vermute auch das es daran liegt. Sascha hat aus meiner Sicht aber Recht WPF und Forms ist nur für Windows also könnte es rein kommen.

    ich habe gestern noch den ganzen Tag an dem Thema gearbeitet ohne weiterzukommen. Dafür gibt es weitere Probleme für die ich noch keine Lösung habe:

    MVVM Light Toolkit trotz Core Version CanExecuteChange Event für Relaycommands funktioniert nicht (feuert nicht) => habe ich jetzt behoben, das Core Framework von Galasoft wurde seit Jahren nicht mehr aktualisiert, daher ist CommandWPF nicht verfügbar. Habe die Implementierung von RelayCommand geändert und jetzt geht es wieder.
    ReportViewer ist nicht verfügbar -> da hab ich einen Ansatz gefunden aber durch Das Relaycommand Problem noch nicht betrachtet.

    um Saschas Frage zu beantworten:
    auf die Interop werde ich nur schwer verzichten können, mein Programm ist ein CRM es holt sich Mails, Kontakte usw. über Outlook verschickt diese usw. (hier könnte ich noch auf eine direkte Anbindung an den Exchange zurückgreifen), aber ich schreibe auch Briefe über das System also Textkonserven werden mit Daten aus dem CRM angereichert und dann in Word Vorlagedokumente integriert. Bevor ich den Modus komplett Umbaue erzeuge ich lieber beim Programmstart neue Instanzen.
    mfG.
    Stephan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kaifreeman“ ()