myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Office-Technologien (https://www.mycsharp.de/wbb2/board.php?boardid=73)
--- Outlook: Export Programm bringt "System.OutOfMemoryException" (https://www.mycsharp.de/wbb2/thread.php?threadid=122087)


Geschrieben von flex am 07.08.2019 um 08:33:
  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.

C#-Code:
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:

XML-Code:
<runtime>
   <gcAllowVeryLargeObjects enabled="true" />
</runtime>

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

Viele Grüße


Geschrieben von hypersurf am 08.08.2019 um 08:36:
 
Kannst Du mal den Stacktrace posten?


Geschrieben von flex am 08.08.2019 um 10:46:
 
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.>


Geschrieben von ThomasE. am 08.08.2019 um 11:02:
 
An welcher Stelle genau in dem Code oben tritt der Fehler auf?


Geschrieben von Taipi88 am 08.08.2019 um 11:53:
 
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


Geschrieben von flex am 08.08.2019 um 12:05:
 
An dieser Stelle:

C#-Code:
(item as MailItem).SaveAs(ExportPathField.Text + folder.FullFolderPath + @"\" + (item as MailItem).ReceivedTime.ToOADate() + ".msg");


Geschrieben von ThomasE. am 08.08.2019 um 16:12:
 
Hallo, kann es sein das die Platte voll läuft? Ganz eine einfache Frage ;)


Geschrieben von Abt am 08.08.2019 um 18:06:
 
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.


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 21.11.2019 09:27