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

我有一个多个程序集C#Excel插件,它通过程序集边界传递embedded式互操作types。 当我在configuration为使用.NET 3.5的Excel进程中运行这个时,一切正常。 当我在configuration为使用.NET 4.0的Excel进程中运行这个时,只有在插件程序集自身加载中定义的应用程序逻辑的控制。 我想我明白为什么,因为在.NET 4.0中embedded式互操作types的处理发生了显着的变化,所以它们不能跨越assembly边界。 我感到困惑的是,我认为在.NET 4.0中,CLR的多个实例可以托pipe在一个Windows进程中。 如果我的插件以.NET 3.5为目标,为什么它不能运行在Excel拥有的.NET 3.5 CLR实例中? 为什么Excel试图在.NET 4.0中运行我的插件? 重写插件并不是一个真正的select,但它需要安装一个也使用.NET 4.0插件的客户端,所以用registry项或Excel.exe.config文件来播放是不行的…任何帮助将会非常感谢!

标题中问题的答案是“是”。 .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 APIdevise和代码有点不同,具体取决于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互操作types更改的方式通常会使事情变得更好 ,因为运行时现在可以根据GUID正确标识从不同程序集定义的types“相同”。

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

我不熟悉开发Excel的插件,但是你可以做到这一点。
但是在同一个进程中使用不同版本的clr是自动完成的。
你可以在这里阅读细节。