我有一个基于.net 3.5的dll - 它在内部使用例如Linq,但是暴露的API很简单,没有花哨的东西。由于C#泛型在编译时被解析,我认为对于调用方来说,所有重要的都是API(所有公共部分)。
然而,当我尝试使用net2.0项目中的这个dll时,我得到了信息,因为dll或其中一个依赖项需要更高版本的.net框架,所以无法引用dll。
我可以在目标计算机上安装我想要的任何.net版本(当安装整个应用程序时),但是我无法更改项目本身的.net版本。
所以:如何解决这个问题?在这个项目中添加C dll时我没有这样的问题,C#dlls是否自包含?
答案 0 :(得分:9)
C#dll需要运行.Net运行时才能运行,因为它们没有编译成机器代码。在这种情况下,dll表示它需要Net 3.5,因此您的所有项目都必须使用3.5或更高版本。
要将您的项目保留为Net 2.0,您需要构建另一个可执行文件以包含3.5 DLL并在不同的进程之间进行通信。
C DLL在编译为本机代码时工作,不需要.Net框架。 (或者至少不是高于2.0的版本)
答案 1 :(得分:6)
我一直在ASP.NET 2.0应用程序中使用 System.Core 和新的 System.Web.Extensions (例如)(使用VS2005)一段时间现在没有问题。与Scott Hanselman撰写的关于here的博客类似。是的,这是可能的。
.NET 3.5仍然在与.NET 2.0相同的CLR上运行。所以在运行时它们都是一样的。 (假设您已经跟踪了任何依赖项并将这些3.5 DLL复制到您的bin文件夹中。)
唯一真正的限制是您可以在开发时使用的C#语言功能。例如'var',扩展方法或LINQ查询语法。
答案 2 :(得分:2)
如果您使用linq对象,那么您可以使用Linq Bridge: http://www.albahari.com/nutshell/linqbridge.aspx
这是针对.net 2.0的对象实现的Linq。
您仍然需要使用vs2008进行编译,但在这种情况下您可以使用.net 2.0作为目标平台进行编译。 (这是因为即使你定位.net 2.0,C#3编译器也能理解linq子句,在这种情况下它只会解析对linqbridge而不是.NET 3.5库的调用)
答案 3 :(得分:2)
如果您使用的是.NET 3.5库,那么您的应用程序的要求应该是其API的任何消费者也应该使用.NET 3.5。
您可以绕过此方法的唯一方法是将 所有 打包应用程序的依赖项。这意味着您的应用程序使用的库依赖于.NET 3.0 和 3.5框架。
但是,我不确定破解.NET框架块并用应用程序打包它们的合法性。在做这样的事之前,我已经阅读了EULA。国际海事组织,这不值得麻烦;只需安装3.5,请您的用户安装3.5并完成它或仅使用2.0功能和库。至少,如果将来有框架更新,那么这样的黑客攻击只会让你在部署时更加痛苦。
在任何一种情况下,你的应用程序都可以在.NET 2.0上运行,3.0和3.5只是2.0运行时和库之上的额外库(正如Craig所提到的),只要你的所有依赖都在那里。
答案 4 :(得分:1)
C#DLL不是自包含的。如果您的3.5 DLL需要LINQ,它依赖于3.5(3.0准确)框架中的系统程序集,因此整个应用程序依赖于此版本。
您可以动态加载3.5程序集并使用反射来访问所需的功能。当然,这需要一些开销。
答案 5 :(得分:1)
没有什么可以,但有一些方法可以让代码愉快地一起工作(按照优先顺序):
1)将两个项目升级到3.5
如果我理解正确,那么您的.net FW 2.0程序将依赖于3.5库,这意味着该程序的每个功能都可以使用,现在需要FW 3.5。由于您声明具有重新编译程序的代码和权限并在部署时安装任何FW,因此您可以将其升级到3.5。听起来很简单,但是既然你没有这样做,那么我猜你有充分的理由(比如其他程序在调用链中更高,你无法升级到3.5 /重新编译。)
2)绕过FW2.0编译器
在引用2.0版本的库(或虚拟,仅提供公共API)时构建程序。 在没有程序的情况下单独构建3.5版本的库(因此无需引用错误的FW程序集)并部署3.5版本而不是2.0版本。 由于2.0和3.5使用相同的CLR运行时,因此欺骗编译器就足够了。只要部署机器安装了FW 3.5,一切都应该没问题。 注意:即使您在部署计算机上只有.net 2.0并且用户没有调用.net 3.5类,一切都很好。如果他这样做,就会崩溃;)
3)将库降级为2.0
如果你只使用.net FW的某些类,那么你可以通过将那些缺少的未来程序集添加到项目中来继续使用2.0编译器。 (这是Craig分享的Hanselman链接的解决方案)。如前所述,你将失去3.5版本的编译器的语法糖,如vars。
选择最适合您情况的人。