如何在CLR 1.1或2.0应用程序中使用CLR 4.0组件?

4

我曾看到一些讨论在新版CLR 4.0应用程序中使用旧版CLR 2.0组件的情况,但如果相反地需要做到这一点呢?

例如,如果有一个.Net 2.0的遗留应用程序,并希望利用完全利用4.0版本CLR的较新业务逻辑,该如何在遗留应用程序中引用较新的组件并访问其方法?如果遗留应用程序是.Net 1.1,是否仍然适用同样的方法?

(为了明确起见添加附注)

虽然升级是理想的,但仍存在技术或政治限制的边缘情况。


1
我曾经看到过通过com实现这个功能,但这可能是一个糟糕的想法。 - Yuriy Faktorovich
3个回答

3

一般来说,您应该将遗留应用程序升级到使用.NET 4。代码不应需要更改。

否则,处理此问题的主要支持方法是通过COM互操作性。您的.NET 4类可以标记为[ComVisible],然后您可以构建互操作性程序集以在旧版.NET版本中“消耗”它。

然而,这种方法有许多缺点 - 包括增加了大量复杂性和降低了性能。


谢谢回复!我完全同意,理想情况下我们希望升级应用程序,而这个特定的应用程序确实是一个边缘案例。 - Bob Palmer
@Bob:是的,我也在做这个(请看我在Kragen的帖子上的评论..) - Reed Copsey

0
你应该将旧的 .Net 1.1 或 2.0 应用程序针对 .Net 4.0 进行优化 - 因为目标机器必须安装 .Net 4.0 才能使用 .Net 4.0 组件,所以将应用程序针对 .Net 2.0 进行优化并没有真正的优势。

有时这是不可能的。例如,我目前正在为一个早于.NET 4的第三方应用程序开发插件,因此必须使用COM互操作才能使其正常工作。 - Reed Copsey
@Reed - 确实如此,但是“How would one use a .Net 4.0 component in a .Net 2.0 app”意味着他们是.Net 2.0应用程序的作者。 - Justin

0

请查看Rick Byers和Simon Hall:CLR 4-并置进程-什么。如何。为什么。

请检查this评论:

假设我拥有您在视频中提到的隔离级别,是否可以将clr4运行时In-process SxS加载到托管的clr2应用程序中(反之亦然)? 如果是,请问我需要做什么? 是否有任何托管API需要调用? 还是我需要某种层来为我加载其他clr? 有没有beta1的示例供我参考?


CLR加载实际上是通过本机API发生的,可以直接使用托管API(例如ICLRMetaHost),也可以通过COM间接使用。您可以使用.NET的互操作性功能在托管代码中执行此操作(无需编写任何本机代码)。因此,您可以编写在CLR v2中运行并加载CLR v4及反之的代码。
我知道我们正在制作一些代码示例,但我认为它们还没有发布。请关注CLR团队博客的SxS类别。最简单的方法是使用一个版本的.NET构建托管COM组件,然后像没有SxS一样使用COM-Interop从另一个版本的.NET实例化它。查找任何使用.NET 2.0构建和使用COM组件的示例。
希望这可以帮助您,Rick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接