大家今天咱来聊聊TargetFramework这个事儿。作为一个常年码代码的老码农,最近我可是被这个TargetFramework给折腾一番,不过总算是搞明白,今天就来跟大家分享一下我的实践过程,保证让你们听得明明白白。
起因
事情是这样的,我手头上有个项目,一开始是在.NET Framework 4.7.2上跑的,挺稳定。但你知道的,这技术更新换代快,.NET 6都出来好一阵子,我就琢磨着,要不咱也升级一下?既能体验新特性,又能跟上时代潮流,岂不美哉?
初次尝试
说干就干,我先把项目的TargetFramework改成net6.0。心想这不就完事?结果,一编译,好家伙,一堆错误提示,看得我头都大。仔细一看,原来是有些老的库和.NET 6不兼容。
深入研究
这下我可不敢乱来,赶紧去查资料。这才知道,原来TargetFramework这玩意儿,可不是随便改的。它决定你的项目能用哪些API,能支持哪些平台。像.NET Framework和.NET 6,虽然都叫.NET,但底层差别还挺大的。有些在.NET Framework上能跑的代码,到.NET 6上就直接歇菜。
我还解到,除直接指定一个TargetFramework,还可以用TargetFrameworks(注意这个s)来指定多个目标框架。这意味着意味着你可以让你的项目同时支持.NET Framework 4.7.2和.NET 6.0!这可太棒,既能保证老用户的兼容性,又能拥抱新技术,简直是两全其美。
解决问题
知道原理后,我就开始动手。我把项目的TargetFramework改成TargetFrameworks,然后在里面填上net472;net6.0。这下,项目就可以同时针对这两个框架进行编译。这还不够,因为有些代码在两个框架下是不一样的,这时候就得用上条件编译。
条件编译,说白,就是用#if ... #endif这种语法,来告诉编译器,这段代码只在哪个框架下编译。比如:
#if NETFRAMEWORK
// 这段代码只在.NET Framework下编译

*("Running on .NET Framework");
#endif
#if NET
// 这段代码只在.NET (.NET Core, .NET 5+)下编译
*("Running on .NET");
#endif

通过这种方式,我就把那些不兼容的代码给区分开,保证在不同的框架下都能正常运行。
最终成果
经过一番折腾,我的项目终于可以同时支持.NET Framework 4.7.2和.NET 6.0。这下,无论是老用户还是新用户,都能愉快地使用我的程序。而且我还发现,通过这种方式,可以有效缩小应用程序的执行代码,提高内存利用率。因为那些只在特定框架下才需要的代码,不会被打包到其他框架的版本里,减少冗余。
一点小感悟
这回实践让我深刻体会到,做技术不能只看表面,得深入解底层原理。TargetFramework这个东西,虽然看起来简单,但里面的门道还真不少。只有把这些门道搞清楚,才能更好地驾驭它,让它为我们服务。
我还想告诉大家,遇到DLL地狱不要慌张。因为每个程序它都有自己的独立性,封装性非常这样即使我们需要升级软件版本,也可以很轻松的完成。
好,今天的分享就到这里,希望能对大家有所帮助。如果你也有类似的实践经验,欢迎在评论区留言交流!