首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Prism / CAG / Unity调试扩展Excel外接程序

使用Prism / CAG / Unity调试扩展Excel外接程序
EN

Stack Overflow用户
提问于 2011-05-04 15:14:52
回答 2查看 938关注 0票数 1

我正在使用复合应用程序指南(Prism for Visual 2008/.NET 3.5)开发Excel文档级外接程序。

其中一个要求是这个外接程序应该是可扩展的,也就是说它应该允许在运行时加载插件dll。我正在创建这样的统一目录模块目录:

代码语言:javascript
复制
// the path where the WorkbookProject.dll Add-In (WorkbookProject\bin\Debug) resides
string fullPath = AppDomain.CurrentDomain.BaseDirectory;
string theDirectory = Path.GetDirectoryName(fullPath);

return new DirectoryModuleCatalog() { ModulePath = fullPath };

我的简化项目层次如下:

代码语言:javascript
复制
Common
-ref: none

WorkbookProject // the main project with xlsx workbook (shouldn't reference any PlugIns)
-ref: Common

PluginOne
-ref: Common
-PostBuildEvent copies output dll to WorkbookProject\bin\Debug

Setup (temporarily knows all plugins, but they should be installed separately)
-ref: Common
-ref: PluginOne
-ref: WorkbookProject

这在部署后运行良好(所有dll都位于由安装项目创建的应用程序文件夹中),但在调试期间,我在Microsoft.Practices.Composite.Modularity.ModuleCatalog.Load()上得到了异常

System.IO.FileLoadException: API restriction: The assembly 'file:///(...)\WorkbookProject\bin\Debug\Common.dll' has already loaded from a different location. It cannot be loaded from a new location within the same appdomain.

在Visual输出/调试窗口中,我可以看到这个文件已经从

C:\Users\Me\AppData\Local\assembly\dl3\JWCWD78V.HAZ\H2VHNAYM.XW1\18912686\7e8ea552_620acc01\Common.dll

为什么我的所有应用程序文件(从WorkbookProject引用)在调试期间都被复制到AppData目录中?有可能避免这种情况吗?

如果我将我的项目从工作簿外接程序转换为应用程序外接程序,会有什么不同吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-05 08:32:11

我想我解决了这个问题。

在Common.dll上似乎存在版本不匹配。

我注意到在我的调试配置中,没有检查PluginOne是否构建,因此在调试期间加载了一个旧版本的PluginOne。

在我纠正了这个问题并重新添加了对Common.dll的所有引用之后,问题就不会出现了。

现在,我的PluginOne.dll从AppData加载(请注意,它是在运行时动态进行的,因为DirectoryModuleCatalog路径是WorkBookProject\bin\Debug,并且我的.VSTO或WorkbookProject.dll.manifest中没有对PluginOne的任何引用)

还请注意,当您对VS2008使用复合应用程序指南时,DirectoryModuleCatalog指定的文件夹不能包含本机dll,否则将引发BadImageFormatException。使用subdir:ModulePath=fullPath+"\Modules"或查看GetNotAllreadyLoadedModuleInfos()方法在V4版的棱镜中进行快速修复)

票数 0
EN

Stack Overflow用户

发布于 2011-05-16 01:42:14

这是一个非常有趣的使用VSTO,您似乎已经解决了您的问题,但我只是想知道您是否会更好地使用一个更新的技术栈来实现这一点。

在棱镜之上使用MEF作为外接程序架构可以更干净,因为每个项目的原因都有很大的不同,而且MEF有一个更干净的模型,我认为它也可以充当一个基本的IoC容器。像Autofac这样的容器还为您提供了比统一更显式的生命周期管理,这在使用COM Interop时是一个优势。

我也有一个项目vsto控制(http://vstocontrib.codeplex.com/),这也可能帮助你,特别是如果你有丝带和其他东西注册通过外接程序。

只是我的2c的方法,但总体来说,非常酷,你正在做所有这些与VSTO。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5885703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档