添加第二个项目后构建VSTO-Addin时抛出InvalidDeploymentException异常
我之前踩过一模一样的坑,折腾了好半天才找到问题根源和解决办法,给你详细梳理下:
问题根源
VSTO默认采用ClickOnce部署机制,当你在VSTO项目里引用了同解决方案下的WinForms/WPF项目时,ClickOnce不会自动把这个依赖项目的输出文件(比如对应的.dll)纳入部署包。安装.vsto时系统找不到必要的组件,就会抛出InvalidDeploymentException。
解决方案(按优先级尝试)
调整ClickOnce应用程序文件设置
右键你的VSTO项目 → 属性 → 切换到「发布」选项卡 → 点击「应用程序文件」按钮。在弹出的窗口里,找到你引用的WinForms/WPF项目生成的.dll文件(名字通常和项目一致),把它的「发布状态」改成「包含」,「下载组」保持「(Required)」。确认后点击确定,重新构建解决方案。统一依赖项目的输出路径
右键你的WinForms/WPF项目 → 属性 → 生成 → 输出路径,设置成和VSTO项目完全相同的路径(比如都是bin\Debug\或者bin\Release\)。这样VSTO项目构建时能直接找到依赖文件,避免部署时遗漏。清理缓存后重新生成
有时候旧的构建缓存会搞出奇怪问题:先点击Visual Studio顶部菜单的「生成」→「清理解决方案」,然后手动删除VSTO项目的bin和obj文件夹,最后重新「生成解决方案」,再尝试运行或发布。检查ClickOnce签名设置(如果启用)
如果你的VSTO项目开了ClickOnce签名,要确保依赖项目的.dll也被正确签名,或者在VSTO的发布设置里允许未签名依赖。可以右键VSTO项目属性 → 签名 → 临时关闭「为ClickOnce清单签名」测试下,看是不是签名导致的问题。
兜底方案(前面方法都没用时)
直接编辑VSTO项目的.csproj(C#)或.vbproj(VB.NET)文件,手动添加对依赖文件的部署引用:
<ItemGroup> <Content Include="..\你的WinForms项目名\bin\Debug\你的WinForms项目名.dll"> <Link>你的WinForms项目名.dll</Link> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup>
记得把路径和文件名替换成你自己的,保存后重新构建即可。
内容的提问来源于stack exchange,提问作者Chandraprakash

