我可以在同一个Windows进程中拥有CLR的.NET 4.0实例和CLR的.NET 3.5实例吗?

时间:2012-04-30 14:42:59

标签: excel clr vsto

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

2 个答案:

答案 0 :(得分:3)

标题中的问题答案为“是”。 .NET运行时版本2.0(它是.NET Framework 2.0,3.0和3.5使用的运行时版本)可以在.NET运行时版本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运行时的加载项访问。在.NET 4.0中改变COM互操作类型的方式通常会使事情更好,因为运行时现在可以根据GUID等正确地将从不同程序集定义的类型识别为“相同”。

为了让生活更轻松,我还可以建议Excel-DNA(我开发的)。它是一个免费且简单的附加库,用于在.NET中制作功能齐全的Excel加载项,而无需使用VSTO。 Excel-DNA允许您定位任何版本的Excel以及任何2.0+版本的.NET。

答案 1 :(得分:0)

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