我有一个多程序集 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 中运行我的插件?重写插件并不是一个真正的选择,
2 回答
您标题中问题的答案是“是”。.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).aspx和http://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 为目标。
我不熟悉开发 excel 插件,但是你可以这样做。
但是,在同一进程中使用不同版本的 clr 是自动完成的。
您可以在此处阅读详细信息。