Outlook VSTO加载项点击插入图片按钮代码崩溃问题求助
问题根因
你当前的报错核心是传入AddPicture方法的路径无法被正确定位,有两个典型触发原因:
- 你写的
@"\Resources\Picture.jpg"是相对系统根目录的路径,VSTO加载项运行时的默认工作目录为Outlook安装目录,而非你的加载项部署目录,路径指向的文件实际不存在。 - 如果你将图片作为嵌入资源存放在项目Resources.resx中,图片会被编译到加载项的DLL文件内,不存在独立的物理文件路径,直接传字符串路径必然失败。
解决方案
场景1:图片作为内容文件随加载项部署
适合需要后续修改图片、不用重新编译加载项的场景:
- 首先在项目中找到
Resources文件夹下的Picture.jpg,右键打开属性面板,修改两个配置:
- 生成操作:选择「内容」
- 复制到输出目录:选择「如果较新则复制」
- 修改代码,先获取加载项的实际部署目录,再拼接图片路径:
using System.Reflection; using System.IO; private void button_Click(object sender, RibbonControlEventArgs e) { Outlook.Inspector inspector = Globals.ThisAddIn.Application.ActiveInspector(); // 先判断当前窗口是不是邮件编辑窗口 if (inspector == null || inspector.CurrentItem is not Outlook.MailItem) { MessageBox.Show("请先打开邮件编辑窗口"); return; } Word.Document document = inspector.WordEditor as Word.Document; if (document.Application.Selection == null) { MessageBox.Show("请先定位到邮件正文的插入位置"); return; } try { // 获取当前加载项DLL所在目录 string addInPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); // 拼接完整图片路径 string ImagePath = Path.Combine(addInPath, @"Resources\Picture.jpg"); document.Application.Selection.InlineShapes.AddPicture(ImagePath); } catch (Exception ex) { MessageBox.Show($"插入图片失败:{ex.Message}"); } }
场景2:图片是嵌入到项目资源的嵌入资源
适合图片不需要修改,打包到DLL内减少部署文件的场景:
using System.IO; private void button_Click(object sender, RibbonControlEventArgs e) { Outlook.Inspector inspector = Globals.ThisAddIn.Application.ActiveInspector(); if (inspector == null || inspector.CurrentItem is not Outlook.MailItem) { MessageBox.Show("请先打开邮件编辑窗口"); return; } Word.Document document = inspector.WordEditor as Word.Document; if (document.Application.Selection == null) { MessageBox.Show("请先定位到邮件正文的插入位置"); return; } string tempImagePath = string.Empty; try { // 从嵌入资源获取图片,这里的Picture要和你Resources.resx里定义的资源名保持一致 System.Drawing.Image resourceImg = Properties.Resources.Picture; // 生成临时文件路径 tempImagePath = Path.Combine(Path.GetTempPath(), $"sig_img_{Guid.NewGuid()}.jpg"); // 把资源图片保存到临时文件 resourceImg.Save(tempImagePath, System.Drawing.Imaging.ImageFormat.Jpeg); // 插入临时文件的图片 document.Application.Selection.InlineShapes.AddPicture(tempImagePath); } catch (Exception ex) { MessageBox.Show($"插入图片失败:{ex.Message}"); } finally { // 清理临时文件 if (File.Exists(tempImagePath)) { File.Delete(tempImagePath); } } }
内容的提问来源于stack exchange,提问作者Ivy Knm
相关产品推荐
相关产品推荐

