做⼀个⾼德地图的 iOS / Android MAUI 控件(上)

点击上方蓝字

关注我们

(本文阅读时间:10分钟)

Microsoft Build 2022 ⼤会上正式发布了 .NET MAUI , 对于 .NET 开发者可以⽤ C# 完成跨平台的前端应⽤开发。对⽐起 MAUI 的前身 Xamarin , MAUI 除了可以⽤传统的原⽣开发模式外,还⽀持了 Blazor 的混合式开发。这也让更多⽅向的开发⼈员能进⼊到跨平台的应⽤开发中来。有⼈会提出云原⽣时代,前端开发还重要吗 ?实际上,多端应⽤兼容是云原⽣不可缺少的⻔⾯。互联⽹时代,有很多出⾊的应⽤,并发布了针对第三⽅应⽤的 SDK,开发者可以结合这些 SDK 做相关的解决⽅案。通过 MAUI 能调⽤这些 SDK 吗?我会通过系列⽂章去和⼤家介绍。

03a8d2d259e8dd91a0dfc99535976553.png

为何要绑定原⽣ SDK

我们知道⼀个应⽤可以融⼊不同的场景,例如⼀个打⻋应⽤就需要地图,例如⼀个拍照应⽤就需要社交,例如⼀个如果你是传统的物联⽹应⽤你需要⼀个蓝⽛的通信协议。拿来主义就是⼀个节省的⽅式,可以结合第三⽅提供的 SDK 来完成应⽤的开发。对于 .NET 开发⼈员会是⼀个难点,因为习惯性地去调⽤ DLL ,但在iOS / Android 原⽣开发上,实际上是有不同的库调⽤机制。在 Xamarin 时代,就有不少开发者去⽤ C# 绑定第三⽅的库,例如在中国市场就有⽀付宝,微信,⾼德地图等。到了 MAUI 有什么不⼀样呢?在⼤致上是和Xamarin 绑定⽅式⼀样。但由于 MAUI 融⼊到了 .NET 6,实际上就是⼀个项⽬⽂件格式的改变。现阶段你可以通过命令⾏的⽅式快速构建 iOS / Android 的绑定项⽬。

▌MAUI iOS 库的绑定

dotnet new iosbinding -o iOS.AMapSDK.Binding

要做 iOS / macOS的绑定你除了创建绑定项⽬外,你还需要安装 Shapie ⼯具 (https://aka.ms/objectivesharpie)做对应转换, 可以通过命令⾏去针对 iOS 的动态库和静态库做对应转换。这⾥补充⼀点你的 Xcode环境是必须要安装的。下⾯是⼀个简单的转换语句,更多具体⼤家可以关注我的该系列的 iOS 库⽂件绑定⽂章。

sharpie bind -framework /your path/AMapFoundationKit.framework -sdk
iphoneos15.5

▌MAUI Android 库的绑定

dotnet new android-bindinglib -o Droid.AMapSDK.Binding

Android 的绑定和 iOS 不⼀样,直接把第三⽅库 Android SDK 的 jar 或者 aar 包放进去编译即可。

2044338b167c0ee0ea804425fe3ba9d9.png

如果你希望了解更多可以关注本系列 Android 库绑定的系列⽂章。

控件定制

在 Xamarin.Forms 中,通过渲染器机制对跨平台各⾃控件的引⽤,并且依赖于 INotifyPropertyChanged 。.NET MAUI 没取消了渲染器机制,⽽是引⼊了⼀种称为 Handler 的模式。有了 Handlers 更灵活 ,⽽且在需要时更容易扩展或覆盖。

这是 MAUI 全新的 Handler 模式

d2884621dfce92be52dd4c99b092a1fc.png

我们通过 Handler 机制可以构建好⾼德地图的 MAUI 控件

70a522effa3599b53d6ffcc5fbffa6ec.png

你可以通过 https://github.com/kinfey/AMapMAUIControls 使⽤体验 MAUI 的⾼德 Android / iOS 控件

3b7abf45a5d6623cf277bbff451e03c9.png

5c26f4dc57771aba19484e6838e5e5ed.gif

介绍了⼀些做⾼德地图的 iOS / Android MAUI 控件的主要知识之后,接下来将重点介绍 iOS 原⽣库绑定的知识, 并告诉⼤家在绑定原⽣库过程的⼀些技巧,希望给到⼩伙伴⼀些启发。

认识 iOS 动态库和静态库

在绑定之前,我们需要学习⼀下 iOS 的动态库和静态库。最简单理解的⽅式是在 iOS 中静态库是以 .a 后缀结尾,动态库是以 .dylib 后缀结尾。⽆论静态库和动态库都可以打包成 Framework 。

▌静态库和动态库的区别

  1. 静态库的特点是编译时会把库⽂件直接拷⻉⼀份到⽬标应⽤程序,⽽这个拷⻉是驻留在⽬标应⽤程序⾥⾯的,所以编译完成后,静态库的⽂件就没有⽤了。但有个缺点就是,因为需要拷⻉,所以⽣成的应⽤程序的容量会较⼤。

  2. 动态库和静态库刚好是相反,编译的时候是不会拷⻉到⽬标应⽤程序⾥⾯的,所以⽣成应⽤程序的体积较⼩,⽽且⼀个动态库可以共享给多个应⽤程序使⽤。但⽣成应⽤程序是依赖于动态库,这也导致经常会出现动态库找不到的情况。

我们来拆解⼀下⾼德地图基础的 SDK - AMapFoundationKit.framework

14868afd29f7db55bc53f891dd78d4e0.png

这⾥就包含了对应的头⽂件信息,模块信息,以及静态库。你可以清晰看到⾼德地图打包成 Framrwork 的实现。这也是我们对库概念的认识,编译好的⼆进制代码,向外暴露头⽂件给第三⽅开发者使⽤。

通过 Sharpie ⼯具⽣成 C# 调⽤的接⼝ 

Shapie 是⼀个⾮常好⽤的转换⼯具,它⽀持在 macOS 下对 Objective-C 的库的转。通过 Sharpie 可以对库⽂件给出的头⽂件进⾏转换完成 C# 的绑定。在 MAUI 前身 Shapie ⼯具就已经存在 , 我经常就利⽤这个⼯具做转换。

因为这次⾼德地图的功能我⽤到 3D ,所以我会对⾼德的 AMapFoundationKit.Framework 和MAMapKit.framework 两个 Framework 进⾏绑定转换。

转换 AMapFoundationKit.Framework

sharpie bind -framework AMapFoundationKit.framework -sdk iphoneos15.5

转换 MAMapKit.framework

sharpie bind -framework MAMapKit.framework -sdk iphoneos15.5

补充:MAMapKit.framework 依赖于 AMapFoundationKit.framework ,所以要放在⼀个相同的⽬录下。

这⾥⾯要注意,你需要安装好 Xcode ,建议安装到最新 ,并对应最新的 iOS SDK , 当然你也可以根据需要绑定不同版本的 iOS SDK , 你可以通过⼀次是命令查看环境

sharpie xcode -sdks

通过命令⾏绑定⽣成的是两个⽂件是 StructsAndEnums.cs 和 ApiDefinitions.cs ,StructsAndEnums.cs 对应的是⼀些常量和枚举类型,ApiDefinitions.cs 对应的是⼀些接⼝和⽅法 。

创建 MAUI 的 iOS 绑定项⽬

这⾥创建需要注意,现在 Visual Studio 2022 的模版都没有完成,现在⼤家⽤命令⾏创建,因为我们有两个项⽬,需要创建两个 Binding 的项⽬分别是针对于 AMapFoundationKit.Framework 的项⽬构建

dotnet new iosbinding -o iOS.AMap.Foundation

针对于 MAMapKit.framework 的项⽬构建

dotnet new iosbinding -o iOS.AMap.3D

⽣成好后,需要把 AMapFoundationKit.framework 放到 iOS.AMap.Foundation 的⽬录下,MAMapKit.framework 放到 iOS.AMap.3D ⽬录下。并把⽣成的 StructsAndEnums.cs 和 ApiDefinitions.cs 放到对应⽬录。

2d5ec26c7d876752222cb97ca7df032a.png

项⽬设置调整

1. 在 Sharpie ⽣成的⽬录下 StructsAndEnum.cs ,⽽在构建的 Binding ⽬录下是 ApiDefinition.cs , 要把它替换掉。所以要对 .csproj 项⽬进⾏修改

<ItemGroup><ObjcBindingApiDefinition Include="ApiDefinitions.cs" /><ObjcBindingCoreSource Include="StructsAndEnums.cs" />
</ItemGroup>

2. 对 iOS.AMap.Foundation 进⾏编译

在 AMapFoundationKit.framework.csproj 增加对 Framework 的引⽤

<ItemGroup><NativeReference Include="AMapFoundationKit.framework"><Kind>Framework</Kind><ForceLoad>True</ForceLoad><SmartLink>False</SmartLink></NativeReference></ItemGroup>

Kind :原⽣绑定类型可以是 Framwork 也可以是 StaticLibary

ForceLoad :强加载,选择 True

SmartLink :智能链接

完成的项⽬.csproj 设置为

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net6.0-ios</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>true</ImplicitUsings><IsBindingProject>true</IsBindingProject>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoBindingEmbedding>false</NoBindingEmbedding></PropertyGroup><ItemGroup><ObjcBindingApiDefinition Include="ApiDefinitions.cs" /><ObjcBindingCoreSource Include="StructsAndEnums.cs" /></ItemGroup><ItemGroup><NativeReference Include="AMapFoundationKit.framework"><Kind>Framework</Kind><ForceLoad>True</ForceLoad><SmartLink>False</SmartLink></NativeReference></ItemGroup>
</Project>

编译 iOS.AMap.Foundation , 你会觉得奔溃,因为⾮常多的出错信息。这是因为 Shapie 做转换时,⼀些转换没做好导致的,这个时候你就需要⼀个⼀个进⾏调整

1aa9808ce514e40c6ed8aaebf9f23ca7.png

归类⼀下出错信息

  • The type or namespace name 'VerifyAttribute' could not be found

这类信息时因为转换时候没有确认好属性,所以会增加 VerifyAttribute 字段,这个⼀般情况下把这个字段注释掉就可以了,如

static class CFunctions
{
// NSString * AMapEmptyStringIfNil (NSString *s);
[DllImport ("__Internal")]
// [Verify (PlatformInvoke)]
static extern NSString AMapEmptyStringIfNil (NSString s);
// extern CLLocationCoordinate2D AMapCoordinateConvert
(CLLocationCoordinate2D coordinate, AMapCoordinateType type);
[DllImport ("__Internal")]
// [Verify (PlatformInvoke)]
static extern CLLocationCoordinate2D AMapCoordinateConvert
(CLLocationCoordinate2D coordinate, AMapCoordinateType type);
// extern BOOL AMapDataAvailableForCoordinate (CLLocationCoordinate2D
coordinate);
[DllImport ("__Internal")]
// [Verify (PlatformInvoke)]
static extern bool AMapDataAvailableForCoordinate
(CLLocationCoordinate2D coordinate);
}
  • The type or namespace name 'AMapFoundationKit'

命名空间问题,这个你需要为 StructsAndEnums.cs 和 ApiDefinitions.cs 增加命名控件就可以了,你可以直接⽤ AMapFoundationKit ,也可以⾃⼰修改喜欢的名字 ,我这⾥⽤ iOS.AMap.Foundation 名字和项⽬对应

  • Duplicate 'Static' attribute

这个是因为 ApiDefinitions.cs 的 Constants 重复定义了,这个就需要重新整理归并为⼀个就可以了

  • Unsupported type for Fields: bool for 'iOS.AMap.Foundation.Constants _amapLocationOverseas'.e

类型不对应导致编译不通过,这个时候我修改为

[Field ("_amapLocationOverseas", "__Internal")]
IntPtr _amapLocationOverseas { get; }

这样你就可以编译通过 iOS.AMap.Foundation

3. 对 iOS.AMap.3D 进⾏编译

添加对 iOS.AMap.Foundation的引⽤

因为 MAMapKit.framework 依赖于 AMapFoundationKit.framework , 所以 iOS.AMap.3D 是依赖于iOS.AMap.Foundation

<ItemGroup><ProjectReference
Include="..\iOS.Amap.Foundation\iOS.Amap.Foundation.csproj" /></ItemGroup>

引⼊ MAMapKit.framework

<ItemGroup><NativeReference Include="MAMapKit.framework"><Kind>Framework</Kind><ForceLoad>True</ForceLoad><SmartLink>True</SmartLink><Frameworks>GLKit OpenGLES UIKit Foundation CoreGraphics QuartzCore
CoreLocation CoreTelephony SystemConfiguration Security AdSupport
JavaScriptCore</Frameworks><LinkerFlags>-lz -lstdc++ -lc++</LinkerFlags></NativeReference></ItemGroup>

这个和 AMapFoundationKit.framework 不⼀样的, 需要添加 Framework 编译时需要依赖的项, 以及⽤到的编译⽅式 ,这个和你绑定的 framework 有关, 我这⾥选择⾼德地图,所以按照它们的⽂档要求做了相关设置。

完成的项⽬.csproj 设置为

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net6.0-ios</TargetFramework><RootNamespace>iOS.Amap._3D</RootNamespace><Nullable>enable</Nullable><ImplicitUsings>true</ImplicitUsings><IsBindingProject>true</IsBindingProject>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoBindingEmbedding>false</NoBindingEmbedding></PropertyGroup><ItemGroup><ObjcBindingApiDefinition Include="ApiDefinitions.cs" /><ObjcBindingCoreSource Include="StructsAndEnums.cs" /></ItemGroup><ItemGroup><NativeReference Include="MAMapKit.framework"><Kind>Framework</Kind><ForceLoad>True</ForceLoad><SmartLink>True</SmartLink><Frameworks>GLKit OpenGLES UIKit Foundation CoreGraphics QuartzCore
CoreLocation CoreTelephony SystemConfiguration Security AdSupport
JavaScriptCore</Frameworks><LinkerFlags>-lz -lstdc++ -lc++</LinkerFlags></NativeReference></ItemGroup><ItemGroup><ProjectReference
Include="..\iOS.Amap.Foundation\iOS.Amap.Foundation.csproj" /></ItemGroup>
</Project>

编译 iOS.AMap.3D,你会⽐之前更奔溃,这个时候你需要有⾜够的耐⼼, 除了和之前差不多的出错信息外,还有⼀些新的状况,我这⾥列举⼀下

  • Type 'MAMapViewDelegate' already defines a member called 'MapView' with the same parameter types

造成这个原因是因为⽅法重名了,这也是 Objective-C 声明式语法和传统语法不⼀样的地⽅,所以你要针对这个做重命名

如这个

// @optional -(void)mapView:(MAMapView *)mapView didAnnotationViewTapped:
(MAAnnotationView *)view;
[Export ("mapView:didAnnotationViewTapped:")]
void MapView (MAMapView mapView, MAAnnotationView view);

修改为

// @optional -(void)mapView:(MAMapView *)mapView didAnnotationViewTapped:
(MAAnnotationView *)view;
[Export ("mapView:didAnnotationViewTapped:")]
void MapViewDidAnnotationViewTapped (MAMapView mapView, MAAnnotationView
view);
  • The type or namespace name 'IMAOverlay' could not be found

这个是命名出错,在 ApiDefinitions.cs ⽂件中你可以找到 MAOverlay

[Protocol]
interface MAOverlay : IMAAnnotation
{
// @required -(CLLocationCoordinate2D)coordinate;
[Abstract]
[Export ("coordinate")]
// [Verify (MethodToProperty)]
CLLocationCoordinate2D Coordinate { get; }
// @required -(MAMapRect)boundingMapRect;
[Abstract]
[Export ("boundingMapRect")]
// [Verify (MethodToProperty)]
MAMapRect BoundingMapRect { get; }
}

所以把所有 IMAOverlay 替换为 MAOverlay 即可。

  • The type or namespace name 'AutoGeneratedName' could not be found

把 AutoGeneratedName 取消

  • Constant value '-1' cannot be converted to a 'ulong'

指定类型错误 AllCorners = ~0x0 改为 AllCorners = 0x0

Do not know how to make a signature for CoreLocation.CLLocationCoordinate2D in parameter`coordinates'

C# 是没有指针的,在 Sharpie 转换时出错了

  • 'MAMapView_UserLocation.HeadingFilter': cannot declare instance members in a static class

// @property (nonatomic) CLLocationDegrees headingFilter;
[Export ("headingFilter")]
double HeadingFilter( { get; set; })

这个定义要换成

// @property (nonatomic) CLLocationDegrees headingFilter;
[Export ("headingFilter")]
double HeadingFilter();
  • Cannot convert type 'Foundation.NSObject' to 'nint'

// @property (nonatomic, weak) id<MAOverlayRenderDelegate>
rendererDelegate;
[NullAllowed, Export ("rendererDelegate", ArgumentSemantic.Weak)]
NSObject WeakRendererDelegate { get; set; }

修改为

// @property (nonatomic, weak) id<MAOverlayRenderDelegate>
rendererDelegate;
[NullAllowed, Export ("rendererDelegate", ArgumentSemantic.Weak)]
IntPtr WeakRendererDelegate { get; set; }

或者排除是⼀个漫⻓的过程,但编译成功⼀刻你会⾮常兴奋,这样我们就把 AMapFoundationKit.framework和 MAMapKit.framework 绑定成功了。

尝试创建⼀个 .NET for iOS 项⽬验证⼀下

5ed4762ecbaea6a97d4c75d49184e446.png

  • 具体实现请到我的 GitHub Repo 下载 :

    https://github.com/kinfey/AMapMAUIControls/tree/main/Samples/iOS.Bindings/AMap.iOS.Demo

小结

原⽣库绑定虽然⽐较多繁琐的事情,但是实际上也是⼗分治愈的,当你看到编译通过的那⼀刻,你就会明⽩个中的快乐。还有⼀点,很多⼈认为跨平台移动开发不需要平台的基础知识了,实际还是需要。特别在这种原⽣库的绑定上,就需要你既会 C# ⼜会 Objective-C 。希望该例⼦能给各位有所启发。请⼤家期待下⼀篇 Android 原生库绑定

相关资源

  • 通过 Microsoft Docs 了解 MAUI :

    https://aka.ms/Docs.MAUI

  • 通过 Microsoft Learn 学习 MAUI :

    https://aka.ms/Learn.MAUI

  • 通过 Microsoft Docs 了解 :

    MAUI https://aka.ms/Docs.MAUI

  • 通过 Microsoft Learn 学习 MAUI:

    https://aka.ms/Learn.MAUI

  • 使⽤⾼德地图 SDK for iOS 请访问:

    https://developer.amap.com/api/ios-sdk/gettingstarted

  • 了解 iOS 原⽣库绑定的内容,请访问 :

    https://docs.microsoft.com/zh-cn/xamarin/cross-platform/macios/binding/?context=xamarin%2Fios

0d24c586e8fe102d5d50e7267b55a928.png

谢谢你读完了本文~相信你一定有一些感想、观点、问题想要表达。欢迎在评论区畅所欲言,期待听到你的“声音”哦!

同时,喜欢的内容也不要忘记转发给你的小伙伴们,谢谢你的支持!

22e0e0a995cd30d23207d56642584f52.jpeg

长按识别二维码

关注微软中国MSDN

37f617614ef3f253f06ab5cd6002154f.gif

点击「阅读原文」了解MAUI~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易康eCognition Developer 9.01安装教程(附eCognition下载地址及中文教程)

eCognition是由德国Definiens Imaging公司2009年推出的智能化影像分析软件,2010年被美国Trimble公司收购。eCognition是目前所有商用遥感软件中第一个基于目标信息的遥感信息提取软件,它采用决策专家系统支持的模糊分类算法,突破了传统商业遥感软件单纯基于光谱信息进行影像…

C语言试题194之实现strcpy函数功能

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现st…

[中文版] 可视化 CSS References 文档

本文分享了我将可视化 CSS References 文档翻译成中文版的介绍&#xff0c;翻译工作还在陆续进行中&#xff0c;供学习 CSS 参考。 1. 可视化 CSS References 文档介绍 许多 CSS 的文档都是属性的介绍&#xff0c;而开源项目 css-reference 并没有提供中文版&#xff0c;而当我…

对比 C# 聊聊 C++ 中几类特殊成员函数

一&#xff1a;背景 在 C# 中要说类默认给我们定义的特殊成员函数&#xff0c;莫过于 构造函数&#xff0c;但在 C 中这样的特殊函数高达 6 种&#xff0c;有必要整合一下聊一聊。二&#xff1a;特殊成员函数 1. 默认构造函数和 C# 一样&#xff0c;很多书中都说&#xff0c;如…

Js 枚举定义Layer Icon

layer的icon有7种样式&#xff1a;1-7 [图片来自&#xff1a;https://blog.csdn.net/beauxie/article/details/60959971] 有时候常常记不住 &#x1f623;&#xff0c;不防自己定义一哈&#xff1a; var layerIcon {//无none: -1,//成功success: 1,//失败error: 2,//提问、疑…

前端进阶之路: 前端架构设计(2)-流程核心

可能很多人和我一样, 首次听到"前端架构"这个词, 第一反应是: "前端还有架构这一说呢?" 在后端开发领域, 系统规划和可扩展性非常关键, 因此架构师备受重视, 早在开发工作启动之前, 他们就被邀请加入到项目中, 而且他们会跟客户讨论即将建成的平台的架构要…

C语言试题195之实现strnchr函数功能

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现strnchr函数功能 函数名称:在字符串中查找字符 函数原型:char *strnchr(cons…

8.2设备文件及磁盘分区

2019独角兽企业重金招聘Python工程师标准>>> 概览&#xff1a; 设备文件的创建 权限 设备名 类型 主设备号 次设备号 mknod [-m MODE] NAME type [MAJOR MINOR] 创建时&#xff0c;先查看是否存在设备号的冲突 零磁道零扇区是MBR&#xff1a;Maste…

【ArcGIS风暴】ArcGIS求一个矢量图层中多个图斑的“四至点”坐标案例教程

如图所示,为ArcGIS软件自带的全球矢量数据,怎样求取每个大洲(图斑)的四至坐标(xmin、ymin、xmax、ymax)呢? 参考阅读:【ArcGIS遇上Python】python批量获取栅格数据四至(top,bottom,left,right)坐标代码 文章目录 1. 矢量数据加载2. 四至计算结果3. 四至计算过程1.…

一个关于导出excel模板的实例

1 首先jsp页面 点击模板下载&#xff0c;会自动下载模板&#xff45;&#xff58;&#xff43;&#xff45;&#xff4c;&#xff0c;效果如下 让我们看源码&#xff1a; &#xff11; &#xff4a;&#xff53;&#xff50;页面 <div class"tab-pane" id"p…

腾讯视频VIP会员,周卡特价9.5元!

今天给大家推荐特价充值腾讯视频VIP会员的平台——幻海优品&#xff0c;腾讯视频在线直充&#xff0c;VIP会员实时生效&#xff01;腾讯视频VIP会员特价充值周卡&#xff1a;原价12元&#xff0c;特价9.5元月卡&#xff1a;原价30元&#xff0c;特价22元季卡&#xff1a;原价68…

解决安装SQL Server 2005开发版时,出现“SQL Server 服务无法启动 ”点击重试或取消的解决方法

问题描述&#xff1a; 安装SQL Server 2005开发版时&#xff0c;提示SQL Server服务无法启动&#xff0c;有关详细信息&#xff0c;请参阅SQL Server联机丛书中的主题如何查看SQL Server 2005安装日志文件和手动启动SQL Server&#xff0c;如下图所示。 此时&#xff0c;如果点…

C语言试题196之实现strstr函数功能

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现strstr函数功能 C 库函数 char *strstr(const char *haystack, const char *nee…

关于数据结构(二)

文章目录[点击展开](?)[] 一UI返回功能思路分析实现方法二当前正在CD技能接着上文<<关于数据结构(一)>>&#xff0c;关于数据结构&#xff0c;在实际的开发中或多或少都有涉及到&#xff0c;只是看自己平时没有积累到。下面是我在项目中的几个实例&#xff1a; 一…

JDBC 之 事务

1.概念&#xff1a;事务指逻辑上的一组操作&#xff0c;组成这组操作的各个单元&#xff0c;要么全部成功&#xff0c;要么全部不成功。 2.数据库开启事务的命令dtl&#xff1a; Start transaction开启事务 Rollback回滚事务&#xff08;撤销&#xff09; Commit提交事务 3.JDB…

[转]后端程序员必备:书写高质量SQL的30条建议

以下文章来源于捡田螺的小男孩 &#xff0c;作者捡田螺的小男孩 转载&#xff1a;《后端程序员必备&#xff1a;书写高质量SQL的30条建议》 前言 本文将结合实例demo&#xff0c;阐述30条有关于优化SQL的建议&#xff0c;多数是实际开发中总结出来的&#xff0c;希望对大家有…

GIS热词:AR、VR、MR辨析

AR、VR、MR技术让我们见识到了科技神奇的同时&#xff0c;也让真实可感的现实世界和无法触摸的虚拟世界的联系更加紧密。 1. AR AR&#xff0c;全称Augmented Reality&#xff0c;即增强现实技术。这项技术是利用电脑技术将虚拟的信息叠加到真实世界&#xff0c;通过手机、平板…

云原生数据库是未来数据库的天下

一、传统数据库的发展阶段和痛点 1&#xff09;、传统数据库的发展阶段 ✨人工管理阶段 20世纪50十年代中期以前&#xff0c;计算机只是用来计算的&#xff0c;那么数据管理就只能纯人工. ✨文件系统管理阶段 20世纪50年代后期到60年代中期&#xff0c;这时硬件方面有了磁盘、磁…

用.NET做DDNS动态域名解析和SSL证书申请

本文主要介绍 IPv6 配置 DDNS 解析和 SSL 证书申请工具的开发历程和其中的相关知识。工具使用.NET开发&#xff0c;已开源&#xff0c;目前该工具的域名解析只支持阿里云。文中提及或使用的 .NET 开源项目&#xff1a;SangServerTool&#xff08;DDNS,SSL证书申请工具&#xff…

汇编学习(一)

看的是王爽老师的《汇编语言》第三版基础知识 一.汇编语言的诞生上古时期在汇编语言还未出现的时候&#xff0c;那时的程序员还只能用二进制也就是所谓的机器语言写代码&#xff0c;将0和1编成的程序代码打在纸带或卡片上&#xff0c;再将纸带卡片输入计算机&#xff0c;进行运…