Problem mit Verweis auf Outlook

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Richtglasa.

    Problem mit Verweis auf Outlook

    Hallo zusammen,

    bin nach mehreren Stunden ausprobieren wieder so verzweifelt, dass ich eure Hilfe benötige.
    Habe ein seltsames Problem bei meinem Programm in Visual Studio 2022 mit dem Zielframework: .NET Framework 4.8.
    Ich habe einen Code geschrieben der nach einem Buttonclick eine E-Mail mit einem Aktivierungscode an meine Adresse schicken soll. Das Programm funktioniert, wenn ich es in einem komplett neuen Projekt mit einem Zielframework: .NET Framework 5 ausführe.
    Ich füge den Verweis Interop.Microsoft.Office.Interop.Outlook hinzu und importiere: Imports System.Net.Mail und Imports Outlook = Microsoft.Office.Interop.Outlook. Geht alles perfekt. E-Mail kommt an usw.

    Sobald ich die gleiche Vorgehensweise in meinem bestehenden Projekt mit dem Zielframework: .NET Framework 4.8 nachmache geht es nicht. Das komische daran ist, dass er aber keinen Fehler anzeigt, sondern einfach die Applikation beendet. Selbst mit einem "Try" wird kein Fehler angezeigt. Einfach geschlossen und fertig.

    Kann es überhaupt am Framework liegen?

    Zudem, wenn ich den Originalverweis einfüge, also der der mir vorgeschlagen wird, bekomm ich immer die Meldung, dass er den Verweis nicht findet also z.B. Outlook.Application ist rot unterstrichen. Wenn ich die entsprechende, im anderen Projekt funktionierende .DLL Datei, in mein eigentliches Projekt packe wird der Code ausgeführt aber es kommt wie oben beschrieben kein Fehler.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim olApp As Outlook.Application = New Outlook.Application()
    4. Dim objNamespace As Outlook.NameSpace = olApp.Session
    5. ' Create a new email message
    6. Dim objFolder As Outlook.MAPIFolder = objNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail)
    7. Dim objItem As Object = objFolder.Items.Add("IPM.Note.Mail")
    8. Dim mail As Outlook.MailItem = DirectCast(objItem, Outlook.MailItem)
    9. With mail
    10. .To = "Meine Mailadresse"
    11. .Subject = "Subject "
    12. .Body = "This is a test email."
    13. .Send()
    14. End With
    15. End Sub
    16. End Class



    Hat jemand eine Idee?
    Was übersehe ich?
    Wäre sehr dankbar für paar Tipps. :)

    Richtglasa schrieb:

    .NET Framework 5
    Gibt es nicht. Es gibt .NET 5/6/7/8 (Nachfolger von .NET Core), was aber ein neuer Unterbau im Vergleich zu .NET Framework (ging bis 4.8.1) ist.
    Der Verweis ist wahrscheinlich ein COM-Verweis, richtig?
    Du solltest erstmal feststellen, an welcher Stelle das Programm sich beendet. Wenn Du das Verhalten in Visual Studio hast, kannst Du ja an allen verdächtigen Stellen einen Haltepunkt setzen und so die kritische Anweisung identifizieren.
    Dann solltest Du schauen, ob in einem neuen Testprojekt mit .NET Framework 4.8 das gleiche Verhalten mit der identifizierten Anweisung passiert.
    Dann sag uns, was bei den Versuchen rausgekommen ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Richtglasa Wie sind die Einstellungen in beiden Projekten bezüglich des Prozessors: x86, x64, AnyCPU?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn ich das richtig sehe, willst du nur eine Email verschicken.

    Das geht natürlich hier auch ohne Verweis auf Outlook, indem du MailKit und MimeKit verwendest - damit bist du dann auch vom E-Mail Anbieter unabhängig.

    Die Bibliotheken sind etwas komplexer als das, was du dort hast, aber mit etwas Einlesen auch schnell begriffen.
    Dort gibst du dann im Endeffekt einfach nur die Serverdaten ein und verschickst deine E-Mail.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Danke für eure Antworten.
    Habe noch einige Versuche durchgeführt.

    @VaporiZed Ja es ist ein COM-Verweis. Wenn ich die .DLL aus dem funktionierenden Programm reinkopiere, werden alle Haltepunkte ignoriert und es passiert genau das gleiche. Scheint also hier der falsche Lösungsansatz zu sein. Mit der originalen .DLL-Datei kann ich das Programm ja erst gar nicht ausführen, da der Code Fehlerhaft ist.
    Des Weiteren habe ich versucht ein neues Projekt im gleichen Framework (.NET Framework 4.8) zu erstellen. Leider scheint dies nicht mehr so einfach möglich zu sein. Es wird mir bei neuen Projekten nur noch .NET 5.0, .NET 6.0 und .NET 7.0 angezeigt. Habe hierzu zwar versucht einzelne Komponenten zur Setup von Visual Studio hinzuzufügen (.NET Framework 4.8 SDK, .NET Framework 4.8.1-SDK, .NET Framework 4.8.1 - Targeting-Paket) ,wird mir aber trotzdem nicht angezeigt. Wie gesagt bei Projekten ab .NET 5.0 geht der Code einwandfrei.

    @RodFromGermany in allen Projekten ist AnyCPU eingestellt. Sowohl bei dem wo es funktioniert als auch bei dem wo es nicht funktioniert. Der Haken bei 32-bit bevorzugen ist gesetzt. Trau mich aber nicht den für das nächste Release raus zu machen :-D, da ich nicht genau weiß was damit alles im Detail beeinflusst wird.

    @siycah ja das war auch eine Möglichkeit die ich versucht habe, allerdings müssten die User hierzu ihre Daten kennen und das tun sie nicht bzw. ist zu aufwendig.

    Richtglasa schrieb:

    Trau mich aber nicht den für das nächste Release raus zu machen :-D,
    Bedeutet, dass das Programm auch auf x64-Rechnern als x86 läuft.
    Wenn an dem Programm keine Hardware oder spezifische DLLs hängen, kannst Du den Haken raus nehmen. Einen Test ist es jedenfalls Wert.
    Wenn Du fremde DLLs im Projekt eingebunden hast, zieh die mal auf den IlSpy, der sagt Dir, wie die compiliert sind.
    Und wenn da ne Einstellung falsch ist, kommt eine spezifische Exception, da musst Du die vorherige Einstellung aktivieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Richtglasa schrieb:

    Ja es ist ein COM-Verweis. Wenn ich die .DLL aus dem funktionierenden Programm reinkopiere
    Das klappt bei COM-Verweisen nach meinen Erfahrungen nicht. Du musst den Verweis schon über den Verweismanager hinzufügen.

    Richtglasa schrieb:

    Des Weiteren habe ich versucht ein neues Projekt im gleichen Framework (.NET Framework 4.8) zu erstellen. Leider scheint dies nicht mehr so einfach möglich zu sein.
    Da stimmt dann aber was nicht. .NET Framework-Projekte werden tw. weiter unten angezeigt, sind aber normalerweise noch vorhanden, nur eben tw. in der Liste neben .NET-Projekten etwas schwierig zu identifizieren. Das Problem gilt es erstmal zu lösen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @RodFromGermany
    Haken ist raus. Ändert nichts.
    Habe keine fremden .DLLs eingebunden.
    Bei IlSpy kann ich keine Fehler finden.

    @VaporiZed
    Ahhh ok jetzt hab ich das kapiert. Das war schonmal gut. Vielen Dank hat geklappt. Dachte ich kann das im Projekt umstellen. Aber du erwähntest ja auch, dass es einen ganz anderen Unterbau hat.
    Ein neues Projekt mit 4.8 zeigt mir jetzt einen Fehler in der Zeile 4:


    System.InvalidCastException: "Das COM-Objekt des Typs "Microsoft.Office.Interop.Outlook.ApplicationClass" kann nicht in den Schnittstellentyp "Microsoft.Office.Interop.Outlook._Application" umgewandelt werden. Dieser Vorgang konnte nicht durchgeführt werden, da der QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der IID "{00063001-0000-0000-C000-000000000046}" aufgrund des folgenden Fehlers nicht durchgeführt werden konnte: Schnittstelle nicht registriert (Ausnahme von HRESULT: 0x80040155)."



    Hab es mittlerweile etwas anders gelöst: (Nicht schön aber funktioniert für mich)

    VB.NET-Quellcode

    1. Dim outlookApp As Object = CreateObject("Outlook.Application")
    2. Dim mailItem As Object = outlookApp.CreateItem(0)
    3. mailItem.Display()
    4. mailItem.To = "Mailadresse"
    5. mailItem.Subject = "Text"
    6. mailItem.body = "Text"
    7. mailItem.send()


    Wenn Ihr mit dem Fehler trotzdem was anfangen könnt wäre es interessant zu wissen.
    Ansonsten Danke für eure Hilfe.
    Das genannte Problem/die Fehlermeldung kenn ich, wenn als Ziel-CPU AnyCPU oder x64 eingestellt ist. Nur x86 hat da immer bei mir geklappt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Und somit hatte auch @RodFromGermany mal wieder recht :thumbsup:
    Allerdings geht es nur in Kombination x86 mit Option Explicit oder Option Strict eins von beiden muss verstellt werden.

    Da die Software allerdings auch auf x64 Rechnern laufen soll macht eine Umstellung in meinem Fall keinen Sinn. Und da die andere Version genauso funktioniert mach ich mir auch keine Gedanken mehr darüber wie man das für x64 Ziel CPU's hinbekommen könnte :S

    Danke @VaporiZed