如何在使用VS2008的项目中引用针对3.5目标的框架4.0 dll

4
我有一个dll,使用4.0框架在VS2010中创建(是完整的4.0,而不是客户端配置文件)。 我想在VS2008项目中引用它(这意味着即使我想要重新定位引用项目到4.0,也无法实现),并且升级该项目到VS2010不是一个选项。
我明白为什么在3.5项目中引用4.0“项目”会出现问题,但我不明白为什么在3.5项目中引用4.0 dll会有问题。就我所知,这可能不是问题,但我似乎想不出其他可能性。
我正在尝试在我的3.5项目中使用Fasterflect(http://fasterflect.codeplex.com/),它在4.0功能上有很大依赖(再次强调,我的公司还没有准备好为VS2010付费,因此我无法更改)。一切似乎一开始都很顺利,直到我尝试编译,然后出现关于Fasterflect程序集未签名的错误。所以我下载了实际源代码,对其进行了签名,重新编译了它,并引用了我的新签名程序集。问题是现在它显示警告符号并说:
已解决的文件有错误图像、没有元数据或无法访问。无法加载文件或程序集“C:....\Fasterflect.dll”或其某个依赖项。该程序集是由一个新于当前加载的运行时构建的,因此无法加载。
我尝试按照这里建议的答案http://social.msdn.microsoft.com/Forums/en/clr/thread/36b1a209-55d5-4323-91dc-0919ba2e1d03去做,但是当我这样做时,我会得到另一个错误消息:
找不到元素“supportedRuntime”的模式信息。 C:....\DynamicSql\App.config
而且我似乎也无法解决这个错误。
肯定有一些方法可以让我在VS2008中使用这个dll吧?

我相信这是不可能的,但我不确定。让我们等待那些更加确定的人。 - zmbq
我仍然认为这是不可能的。但是,我也不确定。 - zmbq
或者甚至通过COM... - Brandon Moore
2
这篇链接的文章展示了如何通过在.config文件中强制使用版本4 CLR来运行程序。但是你无法编译程序。3.5 C#编译器无法读取4.0程序集的元数据,因为格式已经改变了。调试也无法进行。 - Hans Passant
显示剩余2条评论
1个回答

7
当您创建一个针对特定版本框架的项目时,您告诉编译器该计算机已安装哪个版本的框架库和运行时。例如,3.5中的System.dll和4.0中的System.dll不同,就像2.0和3.5中的System.dll不同一样。
理论上,您无法保证向前兼容性(3.5引用4.0),因为4.0程序集可能使用3.5中不存在的API。同样,在4.0中无法保证2.0的向后兼容性,因为某些API可能已被弃用和删除。
实际上,4.0与3.5具有足够的向后兼容性,可以在4.0应用程序中引用3.5组件,但需要注意一些问题(有时需要在配置文件中添加指令,因为4.0中的程序集加载与3.5不同)。不幸的是,由于4.0引入了大量新的API,3.5与4.0之间没有太多的向前兼容性,因此我认为您无法从3.5引用4.0程序集。
您可能会因为这个原因看到模式信息异常。 "supportedRuntime"是一个在.NET 4.0中引入的配置元素。但是,由于您正在引用3.5中的程序集,因此解析配置文件的.NET 3.5版本的System.Configuration不识别该元素,因此会引发异常。
唯一的方法可能是(1)更改源并重新编译,修复所有在3.5中不起作用的4.0库API调用,或者(2)在IL级别执行相同的操作,生成新的程序集(您可以使用al.exe完成此操作)。

感谢您的建议。幸运的是,我发现实际上有一个针对3.5框架的dll版本可用。一开始我没有想到去寻找它,因为我已经看过源代码并且它使用了动态关键字和其他4.0功能,我不知道他们还维护另一个版本的源代码。 - Brandon Moore

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