0

我有一个有趣的情况,正在尝试做一些我什至不确定是否可行的事情。

我有一个 .NET 2.0 项目,它通过反射加载程序集,并在该程序集上调用特定方法。我们正在考虑向前发展并开始在环境中使用 .NET 3.5,但希望将与此“主机”应用程序有关的风险降至最低。因此,我们尝试从 .NET 2.0 项目加载 .NET 3.5 程序集,因为 3.5 是 2.0 框架的扩展,等等。

好吧,在这样做时,我们会收到以下错误:

文件“MyDllNameHere.DLL”的格式无效

所以,从这个角度看是不可能的。谁能证实这一点?有解决方法吗?

然后第二个问题,如果不可能,我们可以在 .NET 3.5 下重新编译主机,然后让它通过反射加载 .NET 2.0 程序集吗?

4

3 回答 3

4

这是不可能的,程序集格式在 2.0 和 3.5 之间没有改变。.NET 3.5 使用完全相同的 CLR 版本和程序集元数据格式。版本之间的唯一区别是一组新的程序集,尤其是那些支持 WPF、WCF 和 Linq 的程序集。尝试加载从这些新程序集中引用类型的 3.5 程序集会产生非常不同的错误消息。它会抱怨找不到 3.5 程序集。

当您实际运行 .NET 1.x 版本的 CLR 时,您会遇到这样的异常,2.0 程序集格式确实发生了变化。此外,虽然它与异常消息不匹配,但如果您的代码在 64 位版本的框架上运行并且您尝试加载一个程序集,您将收到一个抱怨程序集格式的异常包含 32 位本机代码。或者反过来。

于 2009-12-11T16:37:21.653 回答
2

好吧,我想在这里发布一个更详细的答案,因为我已经发现了更多细节。首先特别感谢 nobugs,因为他为我指出了问题的正确起点。

首先,nobugs 是正确的,我遇到的错误消息不是正确的错误消息。我的代码被 1.1 主机应用程序错误地调用,而不是 2.0 主机应用程序调用。

当我切换到 2.0 主机应用程序时,真正的魔力就开始了。从我的 2.0 应用程序中,它只是通过反射加载一个类并执行一个特定的方法,我能够成功地实例化和执行一个包含在 .NET 3.5 程序集中的方法,该方法使用 LINQ。

完美运行!

于 2009-12-11T20:16:58.583 回答
1

您不能在 2.0 中加载 3.5 程序集,因为它们可能会引用 2.0 框架中不存在的内容。

你可以像你提到的那样做相反的事情,3.5 应该毫无问题地加载 2.0 程序集。

于 2009-12-11T16:22:45.797 回答