Laden...

Outlook: Export Programm bringt "System.OutOfMemoryException"

Erstellt von flex vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.121 Views
F
flex Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren
Outlook: Export Programm bringt "System.OutOfMemoryException"

Hallo,

ich entwickle gerade ein kleines Programm, mit dem ich die E-Mails sowie Meetings exportieren kann. Alles Items sollen auf dem Dateisystem gespeichert werden, mit der Ordnerstruktur wie sie in Outlook angelegt sind.


private void ExportItems(MAPIFolder folder)
        {
            Directory.CreateDirectory(ExportPathField.Text + folder.FullFolderPath);

            Items items = folder.Items;
            if (items.Count > 0)
            {
                for (int counter = 1; counter <= items.Count; counter++)
                {
                    object item = items[counter];

                    switch (Microsoft.VisualBasic.Information.TypeName(item))
                    {
                        case "MailItem":
                            (item as MailItem).SaveAs(ExportPathField.Text + folder.FullFolderPath + @"\" + (item as MailItem).ReceivedTime.ToOADate() + ".msg");
                            break;
                        case "MeetingItem":
                            (item as MeetingItem).SaveAs(ExportPathField.Text + folder.FullFolderPath + @"\" + (item as MeetingItem).ReceivedTime.ToOADate() + ".msg");
                            break;
                        default:
                            break;
                    }
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(item);
                } 
            }
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(items);

            for (int counter = 1; counter <= folder.Folders.Count; counter++)
            {
                ExportItems(folder.Folders[counter]);
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(folder.Folders[counter]);
            }
}

Das Programm funktioniert mir kleinen Postfächern super, allerdings gibt es bei größeren eine "System.OutOfMemoryException". Der bis dort hin exportierte Ordner ist dann 999MB groß. Ich habe den Build schon auf 64-Bit umgestellt und in der App.cfg folgendes eingefügt, allerdings ohne Erfolg:

  
<runtime>
   <gcAllowVeryLargeObjects enabled="true" />
</runtime>

Ich hoffe Ihr könnt mir helfen und sagen wo mein Fehler ist.

Viele Grüße

H
523 Beiträge seit 2008
vor 4 Jahren

Kannst Du mal den Stacktrace posten?

F
flex Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren

So wie das aussieht funktioniert das nicht.> Fehlermeldung:

System.OutOfMemoryException
HResult=0x8007000E
Nachricht = Es steht nicht genügend Arbeitsspeicher zur Verfügung. Schließen Sie einige Dateien oder Programme, und versuchen Sie es erneut
Quelle = <Die Ausnahmequelle kann nicht ausgewertet werden.>
Stapelüberwachung:
<Die Ausnahmestapelüberwachung kann nicht ausgewertet werden.>

T
461 Beiträge seit 2013
vor 4 Jahren

An welcher Stelle genau in dem Code oben tritt der Fehler auf?

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

1.029 Beiträge seit 2010
vor 4 Jahren

Hi,

so wie ich Office kenne - muss man jedes Objekt separat freigeben. Das sieht zwar bei dir eigentlich danach aus als ob - andererseits hatte ich bei direkter Verwendung der PIA's selbst schon ähnliche Probleme - mit NetOffice war das Problem bei mir von alleine behoben...

LG

F
flex Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren

An dieser Stelle:

(item as MailItem).SaveAs(ExportPathField.Text + folder.FullFolderPath + @"\" + (item as MailItem).ReceivedTime.ToOADate() + ".msg");
T
461 Beiträge seit 2013
vor 4 Jahren

Hallo, kann es sein das die Platte voll läuft? Ganz eine einfache Frage 😉

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

16.807 Beiträge seit 2008
vor 4 Jahren

Ich meine, dass Taipi hier Recht hat.
Outlook ist zickig und will i.d.R. Dinge einzeln disposed haben.

Sei Dir aber bewusst, dass der Zugriff auf Exchange/Office 365 ohnehin der bessere Weg wäre, als direkt sich an Outlook zu hängen.