当前位置: 首页 > news >正文

大型网站开发经典框架软件定制开发外包

大型网站开发经典框架,软件定制开发外包,外贸接单网站哪个好用,设计网站一般要多少钱点击上方蓝字关注我们#xff08;本文阅读时间#xff1a;10分钟)Microsoft Build 2022 ⼤会上正式发布了 .NET MAUI , 对于 .NET 开发者可以⽤ C# 完成跨平台的前端应⽤开发。对⽐起 MAUI 的前身 Xamarin , MAUI 除了可以⽤传统的原⽣开发模式外#xff0c;还⽀持了 Blazor… 点击上方蓝字关注我们本文阅读时间10分钟)Microsoft Build 2022 ⼤会上正式发布了 .NET MAUI , 对于 .NET 开发者可以⽤ C# 完成跨平台的前端应⽤开发。对⽐起 MAUI 的前身 Xamarin , MAUI 除了可以⽤传统的原⽣开发模式外还⽀持了 Blazor 的混合式开发。这也让更多⽅向的开发⼈员能进⼊到跨平台的应⽤开发中来。有⼈会提出云原⽣时代前端开发还重要吗 实际上多端应⽤兼容是云原⽣不可缺少的⻔⾯。互联⽹时代有很多出⾊的应⽤并发布了针对第三⽅应⽤的 SDK开发者可以结合这些 SDK 做相关的解决⽅案。通过 MAUI 能调⽤这些 SDK 吗我会通过系列⽂章去和⼤家介绍。为何要绑定原⽣ 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.BindingAndroid 的绑定和 iOS 不⼀样直接把第三⽅库 Android SDK 的 jar 或者 aar 包放进去编译即可。如果你希望了解更多可以关注本系列 Android 库绑定的系列⽂章。控件定制在 Xamarin.Forms 中通过渲染器机制对跨平台各⾃控件的引⽤并且依赖于 INotifyPropertyChanged 。.NET MAUI 没取消了渲染器机制⽽是引⼊了⼀种称为 Handler 的模式。有了 Handlers 更灵活 ⽽且在需要时更容易扩展或覆盖。这是 MAUI 全新的 Handler 模式我们通过 Handler 机制可以构建好⾼德地图的 MAUI 控件你可以通过 https://github.com/kinfey/AMapMAUIControls 使⽤体验 MAUI 的⾼德 Android / iOS 控件介绍了⼀些做⾼德地图的 iOS / Android MAUI 控件的主要知识之后接下来将重点介绍 iOS 原⽣库绑定的知识 并告诉⼤家在绑定原⽣库过程的⼀些技巧希望给到⼩伙伴⼀些启发。认识 iOS 动态库和静态库在绑定之前我们需要学习⼀下 iOS 的动态库和静态库。最简单理解的⽅式是在 iOS 中静态库是以 .a 后缀结尾动态库是以 .dylib 后缀结尾。⽆论静态库和动态库都可以打包成 Framework 。▌静态库和动态库的区别静态库的特点是编译时会把库⽂件直接拷⻉⼀份到⽬标应⽤程序⽽这个拷⻉是驻留在⽬标应⽤程序⾥⾯的所以编译完成后静态库的⽂件就没有⽤了。但有个缺点就是因为需要拷⻉所以⽣成的应⽤程序的容量会较⼤。动态库和静态库刚好是相反编译的时候是不会拷⻉到⽬标应⽤程序⾥⾯的所以⽣成应⽤程序的体积较⼩⽽且⼀个动态库可以共享给多个应⽤程序使⽤。但⽣成应⽤程序是依赖于动态库这也导致经常会出现动态库找不到的情况。我们来拆解⼀下⾼德地图基础的 SDK - AMapFoundationKit.framework这⾥就包含了对应的头⽂件信息模块信息以及静态库。你可以清晰看到⾼德地图打包成 Framrwork 的实现。这也是我们对库概念的认识编译好的⼆进制代码向外暴露头⽂件给第三⽅开发者使⽤。通过 Sharpie ⼯具⽣成 C# 调⽤的接⼝ Shapie 是⼀个⾮常好⽤的转换⼯具它⽀持在 macOS 下对 Objective-C 的库的转。通过 Sharpie 可以对库⽂件给出的头⽂件进⾏转换完成 C# 的绑定。在 MAUI 前身 Shapie ⼯具就已经存在 我经常就利⽤这个⼯具做转换。因为这次⾼德地图的功能我⽤到 3D 所以我会对⾼德的 AMapFoundationKit.Framework 和MAMapKit.framework 两个 Framework 进⾏绑定转换。▌转换 AMapFoundationKit.Frameworksharpie bind -framework AMapFoundationKit.framework -sdk iphoneos15.5▌转换 MAMapKit.frameworksharpie 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 放到对应⽬录。项⽬设置调整1. 在 Sharpie ⽣成的⽬录下 StructsAndEnum.cs ⽽在构建的 Binding ⽬录下是 ApiDefinition.cs 要把它替换掉。所以要对 .csproj 项⽬进⾏修改ItemGroupObjcBindingApiDefinition IncludeApiDefinitions.cs /ObjcBindingCoreSource IncludeStructsAndEnums.cs / /ItemGroup2. 对 iOS.AMap.Foundation 进⾏编译▌在 AMapFoundationKit.framework.csproj 增加对 Framework 的引⽤ItemGroupNativeReference IncludeAMapFoundationKit.frameworkKindFramework/KindForceLoadTrue/ForceLoadSmartLinkFalse/SmartLink/NativeReference/ItemGroupKind 原⽣绑定类型可以是 Framwork 也可以是 StaticLibaryForceLoad 强加载选择 TrueSmartLink 智能链接完成的项⽬.csproj 设置为Project SdkMicrosoft.NET.SdkPropertyGroupTargetFrameworknet6.0-ios/TargetFrameworkNullableenable/NullableImplicitUsingstrue/ImplicitUsingsIsBindingProjecttrue/IsBindingProject AllowUnsafeBlockstrue/AllowUnsafeBlocks NoBindingEmbeddingfalse/NoBindingEmbedding/PropertyGroupItemGroupObjcBindingApiDefinition IncludeApiDefinitions.cs /ObjcBindingCoreSource IncludeStructsAndEnums.cs //ItemGroupItemGroupNativeReference IncludeAMapFoundationKit.frameworkKindFramework/KindForceLoadTrue/ForceLoadSmartLinkFalse/SmartLink/NativeReference/ItemGroup /Project编译 iOS.AMap.Foundation 你会觉得奔溃因为⾮常多的出错信息。这是因为 Shapie 做转换时⼀些转换没做好导致的这个时候你就需要⼀个⼀个进⾏调整▌归类⼀下出错信息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.Foundation3. 对 iOS.AMap.3D 进⾏编译▌添加对 iOS.AMap.Foundation的引⽤因为 MAMapKit.framework 依赖于 AMapFoundationKit.framework 所以 iOS.AMap.3D 是依赖于iOS.AMap.FoundationItemGroupProjectReference Include..\iOS.Amap.Foundation\iOS.Amap.Foundation.csproj //ItemGroup▌引⼊ MAMapKit.frameworkItemGroupNativeReference IncludeMAMapKit.frameworkKindFramework/KindForceLoadTrue/ForceLoadSmartLinkTrue/SmartLinkFrameworksGLKit OpenGLES UIKit Foundation CoreGraphics QuartzCore CoreLocation CoreTelephony SystemConfiguration Security AdSupport JavaScriptCore/FrameworksLinkerFlags-lz -lstdc -lc/LinkerFlags/NativeReference/ItemGroup这个和 AMapFoundationKit.framework 不⼀样的 需要添加 Framework 编译时需要依赖的项 以及⽤到的编译⽅式 这个和你绑定的 framework 有关 我这⾥选择⾼德地图所以按照它们的⽂档要求做了相关设置。完成的项⽬.csproj 设置为Project SdkMicrosoft.NET.SdkPropertyGroupTargetFrameworknet6.0-ios/TargetFrameworkRootNamespaceiOS.Amap._3D/RootNamespaceNullableenable/NullableImplicitUsingstrue/ImplicitUsingsIsBindingProjecttrue/IsBindingProject AllowUnsafeBlockstrue/AllowUnsafeBlocks NoBindingEmbeddingfalse/NoBindingEmbedding/PropertyGroupItemGroupObjcBindingApiDefinition IncludeApiDefinitions.cs /ObjcBindingCoreSource IncludeStructsAndEnums.cs //ItemGroupItemGroupNativeReference IncludeMAMapKit.frameworkKindFramework/KindForceLoadTrue/ForceLoadSmartLinkTrue/SmartLinkFrameworksGLKit OpenGLES UIKit Foundation CoreGraphics QuartzCore CoreLocation CoreTelephony SystemConfiguration Security AdSupport JavaScriptCore/FrameworksLinkerFlags-lz -lstdc -lc/LinkerFlags/NativeReference/ItemGroupItemGroupProjectReference 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 0x0Do not know how to make a signature for CoreLocation.CLLocationCoordinate2D in parametercoordinatesC# 是没有指针的在 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) idMAOverlayRenderDelegate rendererDelegate; [NullAllowed, Export (rendererDelegate, ArgumentSemantic.Weak)] NSObject WeakRendererDelegate { get; set; }修改为// property (nonatomic, weak) idMAOverlayRenderDelegate rendererDelegate; [NullAllowed, Export (rendererDelegate, ArgumentSemantic.Weak)] IntPtr WeakRendererDelegate { get; set; }或者排除是⼀个漫⻓的过程但编译成功⼀刻你会⾮常兴奋这样我们就把 AMapFoundationKit.framework和 MAMapKit.framework 绑定成功了。尝试创建⼀个 .NET for iOS 项⽬验证⼀下具体实现请到我的 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/?contextxamarin%2Fios谢谢你读完了本文相信你一定有一些感想、观点、问题想要表达。欢迎在评论区畅所欲言期待听到你的“声音”哦同时喜欢的内容也不要忘记转发给你的小伙伴们谢谢你的支持长按识别二维码关注微软中国MSDN点击「阅读原文」了解MAUI~
http://www.zqtcl.cn/news/757567/

相关文章:

  • instagram wordpress北京seo学校
  • 网站优化的基本思想企业网站建设和运营
  • 网站开发电销常遇到问题怎么建立一个群
  • worldpress 建站少儿编程加盟费一般多少钱
  • 哪个公司做网站建设好九一人才网赣州招聘官网
  • 城阳区规划建设局网站哈尔滨网站建设好
  • 中小型网站建设价位无锡有哪些互联网公司
  • 网站内容收费jquery 网站框架
  • 自己建网站买玩具外贸网站如何做推广
  • 网站 配色表注册公司有什么风险
  • 网站管理员登陆后缀重庆建筑证书查询网站
  • 义乌seoseo建站外贸
  • 只做早餐的网站老网站做seo能不能重新注册
  • 门户网站开发需要多少钱百姓网网站源码
  • 网站设计要学哪些保山网站建设
  • 怎样免费设计网站建设企业网站系统源码
  • 海报设计模板网站找网络公司做网站需要注意
  • 网站开发前端后端书籍wordpress 加文章列表
  • 泰安北京网站建设商业网站的后缀一般为
  • 必须网站的访问量wordpress标题大小
  • qq怎么做放资源的网站英语seo什么意思
  • 学生心理健康网站建设论文php开源内容管理系统
  • 机关网站内容建设雄安专业网站建设
  • 有域名有空间怎么做网站怎么制作网站封面
  • 注册域名哪个网站好信息技术制作网站首页
  • 企业网站app制作价格国外外链平台
  • 泉州市网站设计企业网络有限公司经营范围
  • 电子商务网站创业计划书后台管理系统登录
  • 蚂蚁建站网页传奇游戏单职业
  • 标准通网站建设广州 flash 网站