You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MigraDoc生成PDF,ClickOnce发布后出现图片未找到问题

解决MigraDoc在ClickOnce发布后图片找不到的问题

你的Build Action设置为Content是正确的,但核心问题确实是ClickOnce发布后相对路径发生了变化——开发时的相对路径逻辑在部署后的环境里完全不适用。

为什么会出现这个问题?

开发调试阶段,程序运行在项目的bin/Debug或bin/Release目录下,../../db_logo_500p.png能正确回溯到项目根目录找到图片。但ClickOnce会把应用部署到用户本地的专属缓存目录(路径格式类似C:\Users\[用户名]\AppData\Local\Apps\2.0\XXXX\XXXX),这个目录的结构和开发时的项目结构完全不同,原来的相对路径自然找不到文件。

解决方案:

1. 适配ClickOnce的部署路径加载图片

通过ApplicationDeployment类获取发布后的文件存储目录,同时兼容开发调试场景:

using System.Deployment.Application;
using System.IO;

// ...

string imagePath;
if (ApplicationDeployment.IsNetworkDeployed)
{
    // ClickOnce发布后的文件目录
    imagePath = Path.Combine(ApplicationDeployment.CurrentDeployment.DataDirectory, "db_logo_500p.png");
}
else
{
    // 开发调试时的相对路径
    imagePath = "../../db_logo_500p.png";
}
Image img = tfLogoDate.AddImage(imagePath);

2. 确保图片被正确复制和发布

除了Build Action设置为Content,还要把图片的Copy to Output Directory属性设置为Copy if newer或Copy always——这一步能确保图片被复制到编译输出目录,ClickOnce发布时会自动把它包含到部署包中。

另外可以检查发布设置:在Visual Studio的发布向导里,进入「应用程序文件」界面,确认你的图片文件状态是「包含(自动)」,避免被遗漏。

3. 备选方案:将图片嵌入为资源

如果不想依赖外部文件路径,可以把图片的Build Action改成Embedded Resource,然后通过程序集资源加载:

using System.Reflection;

// ...

// 注意:命名空间要和图片所在项目的命名空间一致,文件名要准确
Stream imageStream = Assembly.GetExecutingAssembly()
    .GetManifestResourceStream("YourProjectNamespace.db_logo_500p.png");
Image img = tfLogoDate.AddImage(imageStream);

这种方式下图片会被嵌入到程序集里,完全不用担心路径问题,缺点是修改图片后需要重新编译发布。

内容的提问来源于stack exchange,提问作者Jakob Busk Sørensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:38:21