2012-04-30 39 views
4

我有一个多个程序集C#Excel插件,它通过程序集边界传递嵌入式互操作类型。当我在一个配置为使用.NET 3.5的Excel进程中运行这个时,一切正常。当我在配置为使用.NET 4.0的Excel进程中运行这个时,只有在插件程序集自身加载中定义的应用程序逻辑的控件。我想我明白为什么,因为.NET 4.0中嵌入式interop类型的处理发生了显着变化,所以它们不能跨越程序集边界。令我困惑的是,我认为在.NET 4.0中,CLR的多个实例可以托管在单个Windows进程中。如果我的插件以.NET 3.5为目标,为什么它不能在Excel拥有的.NET 3.5 CLR实例中运行?为什么Excel试图在.NET 4.0中运行我的插件?这不是重写插件的真正选择,但它需要为使用.NET 4.0插件的客户端进行安装,因此使用注册表项或Excel.exe.config文件进行操作并不合适......任何帮助都将非常感谢!我可以在同一个Windows进程中使用CLR的.NET 4.0实例和CLR的.NET 3.5实例吗?

+0

什么是您正在使用的VSTO版本? –

+0

我正在使用VSTO 4.0,它支持.NET 4.0和.NET 3.5。我不知道它是否同时支持。 – richardstartin

回答

3

标题中问题的答案是'是'。 .NET运行时版本2.0(即.NET Framework 2.0,3.0和3.5所使用的运行时版本)可以在运行时版本为4.0的进程中并行运行(这也是版本号由升级的.NET Framework 4.5使用)。

但是,VSTO的情况并非如此简单,因为Excel和VSTO运行时间之间存在交互作用以决定要加载的内容。 VSTO 4基本上包含了针对.NET 3.5(.NET 2.0运行时)和.NET 4.0的Office扩展的不同版本。根据您的目标VSTO 4办公室扩展版本的不同,您可以使用类(与旧VSTO兼容)或主要接口,因此VSTO API设计和代码也有所不同,具体取决于VSTO 4办公室扩展版本你用。然后部署和加载VSTO加载项取决于您定位的VSTO Office扩展的哪个版本。

因此,VSTO 4加载项加载的.NET运行时版本与您加载项的外观相关联。在这里阅读更多:http://msdn.microsoft.com/en-us/library/bb608603(v=vs.100).aspxhttp://msdn.microsoft.com/en-us/library/ee712596.aspx

如果您有其他COM组件,可能是COM组件在不同版本的运行时(例如2.0运行时)中激活,然后无法从基于4.0运行时的加载项访问。该方法COM互操作类型改变在.NET 4.0中通常会做的事情工作更好,因为运行时现在可以正确地识别来自不同的组件定义类型为“持平”的基础上的GUID等

为了使生活更轻松,我也可以建议Excel-DNA(我开发)。它是一个免费且易于使用的插件库,用于在不使用VSTO的情况下在.NET中制作全功能的Excel加载项。 Excel-DNA允许您定位任何版本的Excel以及任何2.0+版本的.NET。

+0

在倒数第二段 - 我在这个插件中有一些东西在一个程序集中,有c-tor命令的类Command(MSExcel.Application应用程序)。然后我在我的插件组件类ConcreteCommand,c-tor ConcreteCommand(MSExcel.Application app):base(app)中。我认为在.NET 4.0之前需要一个PIA来允许这两个组件共享一个MSExcel.Application的定义。我认为这些组件并没有显示出来,因为在.NET 4.0中PIA没有被查看,所以这两个程序集可能不同意MSExcel。应用程序,即使我 – richardstartin

+0

继续......两个程序集可能不同意MSExcel.Application是什么,我认为这是PIA所做的 - 它给所有通信程序集COM类型的通用定义。这是一个有缺陷的理解?这可能是因为我已经(感谢deisgn遗留下来的)嵌入互操作类型作为通用类型参数在这个插件中穿过程序集,它甚至不会针对.NET 4.0进行编译。 – richardstartin

+2

在.NET 4中,如果您不选择“Embed Interop Types”,则将使用PIA作为.NET 3.5(只有一个MSExcel.Application类型)。如果您编译了一个库来引用PIA来将.NET 3.5作为目标,然后将该库加载到具有嵌入式interop类型的.NET 4加载项中,则引用的PIA也将被加载,但.NET 4运行时将足够聪明地认识到类型是“相同的”。 – Govert

0

我不熟悉开发excel插件,但是你可以做到这一点。
但是在同一个过程中使用不同版本的clr是自动完成的。
您可以阅读详细信息here