私は、コードを次しているVSTO C#MailItem.Attachments.Add()がクラッシュ
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);
}
}
}
CALL 1:第一回SendAttachmentsClick()
を呼び出すには、新しい電子メールを開いて、適切にそこにすべての添付ファイルを添付します。
CALL 2:私は、この新しい電子メールメッセージで[キャンセル]をクリックし、再度SendAttachmentsClick()
を呼び出す場合、私は(私はこのコードにブレークポイントを持っている)上記oMailItemAttachments.Add(itemPath)
への呼び出しまで実行をトレースすることができます。ただし、2番目の呼び出しの最初の添付ファイルに対してこの行が呼び出されると、VSTO/Outlook全体がクラッシュするだけです。 try ... catchを追加して例外をキャッチしようとしましたが、決して入力されないので、エラーの内容がわかりません。
UPDATE1: 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でユージンAstafievの記事を読んだ後、私は、COMオブジェクトを解放するために上記の私のコードを修正し、今ではこのように見えますが、問題はまだ私がお勧めしたい
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);
}
}
}
あなたのGetAttachmentsPaths()がどのようにパスを取得しているのだろうか。あなたのローカルマシン上にファイルが存在するのですか、あるいはどこかからダウンロードしていますか?あなたがどこかからそれらをダウンロードしている場合、あなたのキャンセルロジックがダウンロードを削除している可能性がありますか? – cd491415
私はあなたが正しいと信じています。何を指示してるんですか?大いに感謝します – pixel
ダウンロードしたファイルを別の一時ディレクトリに移動し、そこから処理して一時ディレクトリを削除します。私は以下の部分的な解決策を投稿した。 – cd491415