Dll 我可以在.NET2.0应用程序中使用.NET4.0库吗?

Dll 我可以在.NET2.0应用程序中使用.NET4.0库吗?,dll,.net-2.0,.net-4.0,Dll,.net 2.0,.net 4.0,在.NET2.0应用程序中使用.NET4.0库时遇到一些问题。我想我的印象是,作为一个Windows DLL,我的其他.NET应用程序将能够访问它。不是这样吗?在支持这两种环境中的应用程序方面有什么建议吗 编辑:我意识到我需要在目标系统上安装.NET 4.0 Framework,是否有其他原因导致此操作不起作用 编辑:可能应该更具体一些。我们有一个用.NET2.0(ASP.NET确切地说)编写的当前大型/复杂应用程序。我们在.NET4.0中编写了一套新的集成工具和工作流项。我们想向.NET2.0

在.NET2.0应用程序中使用.NET4.0库时遇到一些问题。我想我的印象是,作为一个Windows DLL,我的其他.NET应用程序将能够访问它。不是这样吗?在支持这两种环境中的应用程序方面有什么建议吗

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

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


最终看来,埃尔威克和布莱恩·拉斯穆森都是正确的。由于我不太热衷于通过COM公开内容(不确定这在技术上是否是COM,但不管怎样),我认为我会坚持认为两者不“兼容”,并寻求其他方式,我认为我们已经根据自己的具体需要采取了其他方式。从长远来看,我们希望将.NET 2.0代码升级到4.0。

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

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


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

这可能取决于您如何使用它。在.NET4.0中,您可以选择进程内并行执行(InProcSXS)。这允许您在同一进程空间中承载两个不同版本的CLR。这是

我不知道你是否能在你的处境中利用这一点。我没有直接的经验来帮助你


在某些情况下,这是可以使用的。

是的,这是完全可能的。您只需将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上调用<代码>发布<代码>,当它被销毁时,它释放了<代码> GCRoot < />代码>保持实际组件的生存。


这意味着,由于回调指针等的排列非常复杂,系统最终可能会出现循环引用计数问题,其中一个断开连接的“孤岛”的对象都持有彼此的引用,因此它们永远不会被解除分配。

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

我刚刚发布了一篇文章,基本上符合Daniel的建议


源代码和说明位于:

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

这解决了我的问题

所以我不能以某种方式编译我的.NET4.0库,从而将自己暴露为传统的WindowsDLL?目标工作站将安装.NET 4.0 Framework,这还不够?@Douglas Anderson-是的,你可以。@Douglas Anderson:A