Laden...

Zur Laufzeit korrekte Interop.Outlook Assembly in verschiedenen Versionen einbinden

Erstellt von swordX vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.194 Views
S
swordX Themenstarter:in
2 Beiträge seit 2017
vor 6 Jahren
Zur Laufzeit korrekte Interop.Outlook Assembly in verschiedenen Versionen einbinden

Hallo Community,

ich schreibe mit C# auf Basis von .NET 4.5 eine kleine Anwendung,(nur eine .EXE Datei, weil es auch von Stick startbar bleiben soll) die auf store-Object von Outlook zugreift und Pfade der pst-Dateien ausliest. Es klappt auch ohne Probleme sobald ich Microsoft.Office.Interop.Outlook Assembly der jeweiligen Version referenziere. Allerding soll es möglich sein, verschiedene Outlook Versionen, sprich Outlook 2010, 2013, 365, abzufragen und auf dem Zielrechner vorhandene Assembly zu nutzen. Das Problem ist also, dass ich nur eine interop Assembly referenzieren kann.
Gibt es Möglichkeit es zu umgehen? Denn mit meiner Funktion und verschiedenen Assembleys klappt soweit alles.

Danke in Voraus!!

16.834 Beiträge seit 2008
vor 6 Jahren

Willkommen.

Bitte - vor allem als Neuling - wenigstens ein paar Minuten die Forensuche verwenden.
NetOffice - Ein versionsunabhängiger Wrapper für MS-Office

Das Projekt ist gut, der Macher aber von unserer Seite bewusst nicht mehr in diesem Forum vertreten.
Der Quellcode liegt auf CodePlex, das in Kürze jedoch offline geht.

S
swordX Themenstarter:in
2 Beiträge seit 2017
vor 6 Jahren

Danke schon Mal. Allerdings sollen keine Produkte von Drittanbieter verwendet werden. Sonst wäre es kein Problem.

PS:
Habe bloß vergessen es zu erwähnen.

16.834 Beiträge seit 2008
vor 6 Jahren

Wenn Du absolut gar keine externen Bibliotheken nutzen willst, dann wirst Du nicht sehr schnell sehr weit kommen.
So funktioniert moderne Software Entwicklung einfach nicht mehr (vor allem nicht im .NET Bereich).

Ansonsten schau Dir halt an, wie es NetOffice macht.
Ist schließlich Open Source.

C
26 Beiträge seit 2016
vor 6 Jahren

Du könntest mit Late-Binding arbeiten. Damit entfällt das direkte Referenzieren der Assembly 😉

Hier ist ein kleines Code-Snippet:



      public static void SendMail(string subject, string body, List<string> recipients)
      {
          const int olMailItemType = 0;
          const int olMailHtmlBodyType = 2;

          dynamic oApp = null;
          dynamic oNameSpace = null;
          dynamic oMail = null;
          dynamic oRecips = null;
          dynamic oRecip = null;

          try
          {
              // get a new instance of Outlook
              Type objClassType = Type.GetTypeFromProgID("Outlook.Application");
              oApp = Activator.CreateInstance(objClassType);
              oNameSpace = oApp.GetNamespace("MAPI");
              if (oNameSpace != null)
              {
                  oNameSpace.Logon();
              }

              // create a new mail item
              oMail = oApp.CreateItem(olMailItemType);

              if (oMail != null)
              {
                  // set the mail properties
                  oMail.BodyFormat = olMailHtmlBodyType;
                  oMail.HTMLBody = body;
                  oMail.Subject = subject;


                  // add the recipients
                  if (recipients != null && recipients.Count > 0)
                  {
                      oRecips = oMail.Recipients;

                      if (oRecips != null)
                      {
                          foreach (string recAddress in recipients)
                          {
                              oRecip = oRecips.Add(recAddress);
                              if (oRecip != null)
                              {
                                  oRecip.Resolve();
                              }
                          }
                      }
                  }

                  // display the new message
                  oMail.Display();
              }
          }
          finally
          {
              if (null != oRecip)
              {
                  Marshal.ReleaseComObject(oRecip);
              }

              if (null != oRecips)
              {
                  Marshal.ReleaseComObject(oRecips);
              }

              if (null != oMail)
              {
                  Marshal.ReleaseComObject(oMail);
              }

              if (null != oNameSpace)
              {
                  Marshal.ReleaseComObject(oNameSpace);
              }

              if (null != oApp)
              {
                  Marshal.ReleaseComObject(oApp);
              }
          }
      }