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

Dou*_*son 30 dll .net-4.0 .net-2.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.

Dan*_*ker 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有一个调用ReleaseCCW 的终结器,当它被销毁时,它会解除分配GCRoot实际组件的活动.

这意味着 - 有回调指针的足够复杂的安排,等等 - 系统可能最终与循环引用计数的问题,其中的对象断开连接的"孤岛"都抱着互相引用,所以他们永远不会被释放.


Bri*_*sen 10

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


小智 10

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

如何从基于.NET 2的应用程序使用基于.NET 4的DLL

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