代码之家  ›  专栏  ›  技术社区  ›  Douglas Anderson

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

  •  30
  • Douglas Anderson  · 技术社区  · 16 年前

    :我意识到我需要在目标系统上安装.NET 4.0 Framework,是否有其他原因导致此操作不起作用?

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

    7 回复  |  直到 16 年前
        1
  •  23
  •   Daniel Earwicker    16 年前

    是的,这是完全可能的。只需将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有一个调用终结器。 Release 在CCW上,当它被销毁时,它会释放 GCRoot

    这意味着,如果回调指针等的排列足够复杂,系统最终可能会出现循环引用计数问题,即断开连接的对象“孤岛”都持有彼此的引用,因此它们永远不会被释放。

        2
  •  10
  •   Brian Rasmussen    16 年前

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

        3
  •  10
  •   Greg Bray    12 年前

    我刚刚发表了一篇文章,基本上是丹尼尔的建议。

    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

        4
  •  3
  •   softveda    16 年前
        5
  •  1
  •   Derar    16 年前

    在这种情况下,添加到clr4的进程内并行功能似乎没有帮助,因为他希望在.NET2.0应用程序中使用.NET4.0库。据我所知,如果情况正好相反(在.NEt4.0应用程序中使用.NET2.0),进程内SxS会很有帮助,因为4.0的CLR将在同一进程中与2.0并排工作。。

        6
  •  0
  •   Daniel Melo    16 年前

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

    如果希望应用程序与.NET2.0兼容,可以使用VisualStudio2005或 target

        7
  •  0
  •   savvyBrar    11 年前

    我的应用程序也有一个类似的问题,我无法引用一个API,即使用.NET4.0组件。
    为了解决这个问题,我创建了一个引用.NET4.0项目的新类库项目,然后从.NET2.0项目中调用了这个新程序集。 我将从.NET4.0项目返回的数据映射到.NET2.0项目。