2012-03-17 76 views
3

我有一个在VS2010中使用4.0框架(是的,它是完整的4.0,而不是客户端配置文件)创建的dll。我想在VS2008项目中引用它(意思是我不能将引用项目重新定位到4.0,即使我想要),并且将该项目升级到VS2010不是一个选项。如何在VS2008中引用框架4.0 dll项目目标中的3.5

我明白为什么在3.5项目中引用4.0'项目'时存在问题,但我不明白为什么我应该在3.5项目中引用4.0 dll时遇到问题。就我所知,这可能不是问题,但我似乎无法想象它会是什么。

我正在尝试使用Fasterflect(http://fasterflect.codeplex.com/),它很依赖3.5项目中的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?

+0

我相信这是不可能的,但我不确定。让我们等待更确定的人。 – zmbq 2012-03-17 06:32:44

+0

@zmbq我不知道它是否可以动态加载? – 2012-03-17 06:33:51

+0

我仍然认为这是不可能的。但是,我不确定。 – zmbq 2012-03-17 06:37:00

回答

6

当您创建一个针对特定版本的框架的项目时,您告诉编译器哪个版本的框架库和运行时版本将运行该项目的计算机已安装。例如,3.5中的System.dll和4.0中的System.dll并不相同,这很像为什么2.0和3.5中的System.dll不相同。

理论上,由于4.0程序集可能使用3.5中不存在的API,因此无法保证转发兼容性(3.5引用4.0)。同样,你不能保证4.0在2.0中向后兼容,因为一些API可能已被弃用和删除。实际上,4.0具有足够的3.5向后兼容性,它们允许您在4.0应用程序中引用3.5组装,但有一些注意事项(在配置文件中有时需要add a directive,因为4.0中的组装加载从3.5变为3.5)。不幸的是,由于4.0引入了大量的新API,3.5与4.0没有太大的兼容性,所以我认为你不能从3.5引用4.0组件。

您可能会看到该架构信息异常,可能是由于此原因。 “supportedRuntime”是.NET 4.0引入的配置元素。但是,由于您在3.5中引用了程序集,System 3.5的.NET 3.5版本。解析配置文件的配置不识别该元素,从而引发异常。

唯一的方法可能是(1)更改源代码并重新编译,将所有API调用修复为3.5中不工作的4.0库,或者(2)做同样的事情,但是在IL级别,生成一个新程序集(可以使用al.exe来完成)。

+0

感谢您的建议。幸运的是,我发现实际上有一个针对3.5框架的dll版本。我刚开始并没有想到要找一个,因为我已经看到了源代码,它使用了动态关键字和其他4.0特性,我不知道它们保留了另一个版本的源代码。 – 2012-03-18 02:39:30

相关问题