我在.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。
答案 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项目使用
这解决了我的问题。