ClickOnce安装时无法加载Accord.Video.FFMPEG.dll及依赖项求助
解决ClickOnce发布后Accord.Video.FFMPEG.dll加载失败问题
核心原因
ClickOnce默认会给非托管依赖DLL添加.deploy后缀,但Accord.Video.FFMPEG.dll加载时会寻找原始文件名(如avcodec-57.dll),而非带.deploy的版本,导致依赖找不到。
解决方案
1. 禁止ClickOnce给FFmpeg依赖加.deploy后缀
- 打开Visual Studio,右键项目 → 属性 → 发布 → 应用程序文件。
- 在文件列表中找到所有
av*.dll(avcodec-57.dll、avdevice-57.dll等),将每个文件的哈希设置为「排除」,发布状态保持「包含」。 - 重新发布应用,此时安装目录中的这些DLL会保留原始文件名,不会带
.deploy后缀。
2. 若上述方法无效,添加启动时重命名代码
在应用启动的入口(如Program.cs的Main方法最开头)加入以下代码,自动将.deploy后缀的依赖文件重命名为原始文件名:
using System.IO; string appDir = AppDomain.CurrentDomain.BaseDirectory; // 匹配所有av开头的.deploy文件 string[] deployDlls = Directory.GetFiles(appDir, "av*.dll.deploy"); foreach (string deployPath in deployDlls) { string targetPath = Path.Combine(appDir, Path.GetFileNameWithoutExtension(deployPath)); // 避免重复复制 if (!File.Exists(targetPath)) { File.Copy(deployPath, targetPath); } }
3. 检查平台位数匹配
- 确认项目的平台目标(右键项目 → 属性 → 生成 → 平台目标)与FFmpeg依赖DLL的位数完全一致:
- 若用x86版本的FFmpeg DLL,项目必须设为x86;
- 若用x64版本,项目设为x64,不要用Any CPU(可能导致自动切换位数不匹配)。
4. 验证Accord.Video.FFMPEG.dll的发布设置
- 右键项目中的
Accord.Video.FFMPEG.dll→ 属性,确保「复制到输出目录」设为「始终复制」; - 在发布的应用程序文件列表中,该DLL的发布状态为「包含」,类型为「托管程序集」。
内容的提问来源于stack exchange,提问作者HighwayRob
相关产品推荐
相关产品推荐

