我可以在.NET 2.0应用程序中使用.NET 4.0库吗?

时间:2010-03-04 21:43:29

标签: dll .net-2.0 .net-4.0

我在.NET 2.0应用程序中使用.NET 4.0库遇到了一些问题。我想我的印象是作为Windows DLL,我的其他.NET应用程序将能够访问它。这不是这种情况吗?关于在两种环境中支持应用程序的任何建议?

编辑:我意识到我需要在目标系统上安装.NET 4.0 Framework,还有其他原因导致它不会/不应该工作吗?

编辑:可能应该更具体一些。我们有一个用.NET 2.0编写的当前大型/复杂应用程序(确切地说是ASP.NET)。我们在.NET 4.0中编写了一组新的集成工具和工作流程项。我们想将4.0创建的库中的一个添加到.NET 2.0项目(目前在VS2008中)并使用它的一些方法。当我们这样做时,我们会遇到问题,通常是与记忆有关的神秘错误。

看来Earwicker和Brian Rasmussen最终都是正确的。因为我不太热衷于通过COM暴露事物(不确定这是否是技术上的COM或者不管怎样)我想我会坚持这两个不兼容的想法并且看其他方法,我认为我们根据我们的具体需求。从长远来看,我们将把.NET 2.0代码移到4.0。

7 个答案:

答案 0 :(得分:23)

是的,这是完全可能的。您只需将用4.0编写的组件公开为COM对象。 2.0托管应用程序只是将它们用作COM对象,并且不知道它们是原生的,2.0,4.0还是其他什么。 COM是两个运行时版本必须以相同方式实现的通用接口。

4.0中新的进程内SxS支持意味着当加载基于4.0的COM对象时,它会拉入所需的运行时而不是尝试在2.0上运行,因此两个运行时都存在于管理自己的进程中对象。虽然您无法直接在它们之间传递CLR对象,但您可以传递COM接口,并且CLR会透明地将对象包装在COM接口中。

我不知道你是否可以为两个版本制作单个互操作程序集。但很明显,您可以在2.0中的C#中编写一个互操作程序集,将其导出为.tlb,然后将其导入到4.0中的程序集中。这将为您提供两个匹配的互操作程序集,描述相同的COM接口(或者只是在每个版本的程序集项目中构建相同的C#源代码。)

奖励更新:生成的应用程序是否会基于COM(无论遇到什么问题)?

这取决于你如何看待它。组件的作者将把它们作为COM组件。因此主机应用程序需要定位并将它们作为COM组件加载。这意味着无意中使用GAC,注册表或SxS清单,这不仅仅是告诉组件作者将其程序集放在某个目录中,以便您可以使用反射加载它。

它在运行时会产生影响:当主机引用某个组件时,将不会有一个但只包含三个对象。主机具有对RCW的引用,RCW具有指向由CCW实现的COM接口的指针,CCW又保持对实际组件的引用。中间的CCW是一个引用计数的COM对象,主机的RCW有一个在CCW上调用Release的终结器,当它被销毁时,它会释放保持实际的GCRoot。成分

这意味着 - 通过足够复杂的回调指针排列等 - 系统最终可能会出现循环引用计数问题,其中对象的断开“岛”都保持对彼此的引用,因此它们永远不会得到解除分配。

答案 1 :(得分:10)

请注意,4.0版不仅仅是其他程序集。此版本中的运行时本身也已更改(新的并发GC模式,对线程池进行了大量更改,mscorwks.dll现在称为clr.dll等)。

答案 2 :(得分:10)

我刚刚发表了一篇基本上是丹尼尔建议的帖子。

How to use a .NET 4 based DLL from a .NET 2 based application

源代码和说明:http://code.msdn.microsoft.com/Using-a-NET-4-Based-DLL-bb141db3

答案 3 :(得分:3)

可能取决于您的使用方式。在.Net 4.0中,您可以选择“在进程中并排执行”(InProc SxS)。这允许您在同一进程空间中托管两个不同版本的CLR。这是explained here

你是否可以在我不知道的情况下利用这一点。我没有直接的经验来帮助你。

可以使用它的一些scenarios

答案 4 :(得分:1)

由于他想在.NET2.0应用程序中使用.NET4.0库,因此在这种情况下,添加到CLR 4的进程内并行功能看起来没有用。据我了解,如果案例恰好相反(在.NEt4.0应用程序中使用.NET2.0),进程内SxS将会有所帮助,因为4.0的CLR将与2.0一起使用同样的过程..

答案 5 :(得分:0)

为.NET 4编译的程序集将包含对.NET 2.0中不存在的其他.NET 4框架库的引用。

如果您希望您的应用程序与.NET 2.0兼容,那么如果您使用的是Visual Studio 2008或2010,则可以将Visual Studio 2005或target项目用于.NET 2.0。当然,如果您的目标是项目到.NET 2.0,您将无法利用.NET 3.5 / 4功能。

答案 6 :(得分:0)

我的应用程序遇到了类似的问题,我无法引用API,即使用.net 4.0组件。
为了解决这个问题,我创建了一个新的类库项目,该项目引用了我的.net 4.0项目,然后从我的.net 2.0项目调用了新的程序集。 我映射了从.net 4.0项目返回的数据,以供我的.net 2.0项目使用 这解决了我的问题。