I-Code verfolgt habenVSTO C# MailItem.Attachments.Add() Crashes
public void SendAttachmentsClick()
{
Microsoft.Office.Interop.Outlook.MailItem oMailItem = HostAddIn.Application.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
oMailItem.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatHTML;
// //returns strings representing paths to documents I want to attach
List<string> paths = GetAttachmentsPaths();
if (paths.Count > 0)
{
foreach (string itemPath in paths)
{
oMailItem.Attachments.Add(itemPath);
}
if (oMailItem.Attachments.Count > 0)
{
oMailItem.Display(false);
}
}
}
ANRUF 1:SendAttachmentsClick()
zum ersten Mal aufrufen eröffnet neue E-Mail und legt alle Anlagen, um es richtig.
AUFFORDERUNG 2: Wenn ich in dieser neuen E-Mail-Nachricht auf Abbrechen klicken und SendAttachmentsClick()
dann wieder aufrufen, ich kann die Ausführung verfolgen, bis Anruf oMailItemAttachments.Add(itemPath)
oben (ich habe Bruchstellen in diesem Code). Sobald diese Zeile jedoch für die ersten Anhänge im zweiten Aufruf aufgerufen wird, stürzt der gesamte VSTO/Outlook ab. Ich habe versucht ... fangen, um zu versuchen, Ausnahme zu fangen, aber es wird nie eingegeben, also weiß ich nicht, was der Fehler ist.
UPDATE1: Nach einem Artikel von Eugene Astafiev bei https://www.add-in-express.com/creating-addins-blog/2011/08/10/how-to-add-attachment-to-e-mail-message/?thank=you&t=1467071796#comment-413803 Lesen, modifizierte ich über meinen Code COM-Objekte freizugeben, und jetzt sieht es so aus, aber das Problem weiterhin besteht nach wie vor
public void SendAttachmentsClick()
{
Microsoft.Office.Interop.Outlook.MailItem oMailItem = HostAddIn.Application.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
oMailItem.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatHTML;
Selection olSelection = HostAddIn.ActiveExplorer.Selection;
// //returns strings representing paths to documents I want to attach
List<string> paths = GetAttachmentsPaths();
if (paths.Count > 0)
{
try
{
Microsoft.Office.Interop.Outlook.Attachments mailAttachments = oMailItem.Attachments;
foreach (string itemPath in paths)
{
Microsoft.Office.Interop.Outlook.Attachment newAttachment = mailAttachments.Add(itemPath);
oMailItem.Save();
if (newAttachment != null) Marshal.ReleaseComObject(newAttachment);
}
if (oMailItem.Attachments.Count > 0)
{
oMailItem.Display(false);
}
if (mailAttachments != null)
Marshal.ReleaseComObject(mailAttachments);
if (oMailItem.Attachments != null)
Marshal.ReleaseComObject(oMailItem.Attachments);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (oMailItem != null)
{
Marshal.ReleaseComObject(oMailItem);
oMailItem = null;
}
Marshal.ReleaseComObject(olSelection);
}
}
}
Ich frage mich, wie Ihre GetAttachmentsPaths() die Pfade bekommt. Sind die Dateien auf Ihrem lokalen Computer vorhanden oder werden sie von irgendwo heruntergeladen? Wenn Sie sie von irgendwo herunterladen, könnte es sein, dass Ihre Löschlogik die Downloads löscht? – cd491415
Ich glaube, du hast Recht. Was schlagen Sie vor? Sehr geschätzt – pixel
Ich würde heruntergeladene Dateien in ein anderes temporäres Verzeichnis verschieben, sie von dort verarbeiten und dann das temporäre Verzeichnis löschen. Ich habe unten eine Teillösung gepostet. – cd491415