你有种再说一遍 发表于 2024-11-1 18:39:56

处理低版本兼容性

本帖最后由 你有种再说一遍 于 2024-11-3 19:17 编辑

在C#支持低版本其实是充满各种想法和挑战的.
发现有些人只会说:低版本会淘汰的∽
但是我要的是解决方案,不是让你来告诉我这个东西.
不知道就不知道嘛.

技术产生割裂不一定是坏事情,
但是这肯定是社区分裂的主要原因.

今天分享一则兼容故事.

疯狂青蛙故事:
他居然在acad14加载NET45的dll,然后出现:
错误:出现异常:0x0000005(访问冲突)

原来是因为他一直net framework框架上面写代码,
net framework是利用复制几个.csproj文件,然后修改NET版本,因为VS是读取同目录下的.cs文件,因此可以共享同一套代码,不过这样输出目录是相同的,容易造成引用出错.
也有别的方案,例如建立不同的工程文件夹,再通过`共享工程`引用同一套代码,不过这样产生的工程文件夹和输出文件夹就巨多.

问题在于子工程的引用,子工程也要做多版本!!!然后对应引用!!!
acad要4个NET大版本(35/40/45/80),
如果再引入一个子工程(也是4个),
这样就有8个csproj需要维护...但凡一个出错,就找全世界bug...而且它报错的方式真是与众不同...
你多引用一个dll你就维护.
你多引用一个dll你就维护.
你多引用一个dll你就维护.
我第一次遇到这个问题我都要疯了,工程化怎么还有这么困难的时候...

好在,微软推出了net standard.
转到net standard工程只需要写一个.csproj,里面提供了多框架功能,多net版本是生成不同输出文件夹的.

net standard工程引用同框架子工程,会自动找寻对应的NET版本,这样你就不需要干预引用的问题.
只需要处理不同的API之间的差异,VS会提示你的.
这样就很舒服,不需要担心目录错乱问题了.
(记住一个宗旨:一套代码到处编译,这才是兼容性)

移植技巧:
1,利用win提供的.net升级工具(下方有链接)
2,添加全局命名空间,大部分的预处理都是命名空间,所以用了全局命名空间之后,愉快的删除其他文件内的命名空间吧.
3,处理winform最好就是新建,加一个用到的控件.
比较两个自动生成的设计文件,我就是这样把全部撸顺了.
并且这过程会很痛苦,旧的问题没解决,新的雪球越来越大.让我想起来经济学的钩子定律,一个公司在良好方向时候,会先下降再提升,呈现√

移植之后的好处:
1,生成文件夹是每个版本对应的
2,转换工程之前,`功能文件夹`旧版移除,需要解除文件引用,也就是在vs上面点点点来修改csproj.
而新版就可以随时剪切走,如果你有用自动执行函数,那么`功能文件夹`内部写自动执行的入口点,也就是,会通过主目录反射执行,使得具备文件级的模块化!!
3,再也不是引用一个个dll了,而是全包化,nuget真是用起来爽死,大不了自己打包.

然后青蛙又问:
iTextSharp库在NET40没有啊?难道不提供这个功能?

这样只需要一些手法,
创建一个非cad的NET48独立进程,它来引用低版本没有的包.
然后和cad进行跨进程通讯,返回值少就传输,返回值大就共享内存(例如bitmap的传输).
并且cad层不做预处理,
而是引入接口层来预处理,这样就能通过接口实现转发到本地函数还是跨进程通讯,实现版本的解耦.

这样多爽?acad06的NET35也可以用高版本功能...
不过基于cad的功能则无法享受跨版本的乐趣了,除非你激活本机高版本cad,再跨进程通讯调用...这就是另外的话题了.

其实IFox应该作为接口层.
消息队列和COM就是基于这种解耦操作出现的.
那你为什么不在cad上面实现一个消息队列呢?
对了,这个接口层再Web开发叫中间件.

相关链接:
[我的博文一些图文教程](https://www.cnblogs.com/JJBox/p/12677496.html)

[微软的.net升级工具](https://dotnet.microsoft.com/zh-cn/platform/upgrade-assistant#:~:text=%E7%9B%B4%E6%8E%A5%E4%BB%8E%20Visual%20Studio,%E4%BD%BF%E7%94%A8%E5%8D%87%E7%BA%A7%E5%8A%A9%E6%89%8B%E5%B0%86%E5%BA%94%E7%94%A8%E5%8D%87%E7%BA%A7%E5%88%B0%E6%9C%80%E6%96%B0%E7%9A%84.NET%20%E7%89%88%E6%9C%AC%E3%80%82%20%E5%8F%B3%E9%94%AE%E5%8D%95%E5%87%BB%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E8%AE%A9%E5%B7%A5%E5%85%B7%E5%BC%95%E5%AF%BC%E4%BD%A0%E5%AE%8C%E6%88%90%E8%AF%A5%E8%BF%87%E7%A8%8B%E3%80%82%20%E8%AF%A5%E5%B7%A5%E5%85%B7%E5%B0%86%E4%B8%BA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E9%80%89%E6%8B%A9%E6%9C%80%E4%BD%B3%E5%8D%87%E7%BA%A7%E7%B1%BB%E5%9E%8B%EF%BC%8C%E5%B9%B6%E5%8D%87%E7%BA%A7%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%E5%92%8C%E4%BB%A3%E7%A0%81%EF%BC%8C%E4%BB%A5%E9%80%82%E5%BA%94%E4%B8%80%E4%BA%9B%E9%87%8D%E5%A4%A7%E6%9B%B4%E6%94%B9%E5%B9%B6%E4%BD%BF%E7%94%A8%E8%BE%83%E6%96%B0%E7%9A%84%E5%8A%9F%E8%83%BD%E3%80%82)

luzhmu 发表于 2024-11-4 09:21:52

支持一下:lol

mp41025 发表于 2024-11-4 11:12:18

简洁、明了!厉害的
页: [1]
查看完整版本: 处理低版本兼容性