VS2019 for mac里用c#开发Mac OS应用 避坑 和 源码

首先 Visual Studio 2019 for mac 有很多版本,必须一对一和Xcode的版本对应才能正确开发!! 否则编译都报错

本人xcode11.1 、13.2.1、12.5.1 轮着配 VS2019 for Mac 8.4、8.10 ,编译都报错。提醒大家,不要以为是自己问题,就是两者版本不适配。

本人最后试出来 vs2019 for mac 8.3.1 配 Xcode 11.2 。 亲测正常了。

搞了一礼拜! 微软还不让正常下载旧版,旧版从微软订阅频道下载要收费的。 现在最新版VS for Mac 又要升级自己的mac系统,这升级就会破坏本机目前使用一些mac应用的环境,导致又要下载新版应用。果断不能如此,劝大家不要踩坑!


给Visual Studio for Mac开发苹果应用的初学者建议:

1、 VS版本和Xcode要对应。 不出错,就用本人亲测可用的版本

2、mac OS系统里卸载应用就是卸不干净,无论是360 还是 腾讯的mac维护应用,现在用deepseek 它会回答 清理的终端代码,就可以清干净。 VS 和 Xcode是附件太占硬盘容量,掉了它本体,其它东西还在mac电脑里


如果你需要卸载整个 Visual Studio for Mac 和所有 Xamarin 组件,可以下载并使用微软官方提供的卸载脚本。脚本下载地址为:https://raw.githubusercontent.com/MicrosoftDocs/visualstudio-docs/master/mac/resources/uninstall-vsmac.sh。下载后,在终端中通过 chmod +x 赋予执行权限后运行即可。


手动删干净xcode ,本人上篇文章 点这里


Visual Studio Mac 开发Mac应用的原理:

  1. 在vs中写代码事件,在xcode中摆放控件,如button label textbox
  2. 这两个软件因为适配,就会同步更新两边的更改

微软的一步步教的步骤 : Hello,Mac - 演练 - Xamarin | Microsoft Learn


在vs for mac中获取本机电池的代码

复制代码
using System;
using Xamarin.Essentials;

namespace helloworld1
{
    public class BatteryInfoHelper
    {
        public static double GetBatteryPercent()
        {
            double level = Battery.ChargeLevel;

            level = level * 100;

            return level;
        }

        public static string getState()
        {
            // 根据状态执行逻辑
            switch (Battery.State)
            {
                case BatteryState.Charging:
                    // 正在充电
                    return "充电中";//break;
                case BatteryState.Full:
                    // 电池已满
                    return "电量已满";  //break;
                case BatteryState.Discharging:
                case BatteryState.NotCharging:
                    // 正在放电或未充电
                    return "正在放电或未充电"; //break;
                case BatteryState.NotPresent:
                    // 设备无电池(如台式机)
                    return "本机无电池"; //break;
                case BatteryState.Unknown:
                    // 无法检测状态
                    return "无法检测状态"; // break;
                default:
                    return "状态未知";
            }
        }

        public static void GetBatteryStatus()
        {
            // 1. 获取当前电量百分比 (0.0 到 1.0)
            // 如果连接交流电或无电池,通常返回 1.0
            double level = Battery.ChargeLevel;

            // 2. 获取电池状态
            BatteryState state = Battery.State;

            // 3. 获取电源来源
            BatteryPowerSource source = Battery.PowerSource;

            // 输出调试信息
            //Debug.WriteLine($"电池电量: {level * 100}%");
            //Debug.WriteLine($"电池状态: {state}");
            //Debug.WriteLine($"电源来源: {source}");

            // 根据状态执行逻辑
            switch (state)
            {
                case BatteryState.Charging:
                    // 正在充电
                    break;
                case BatteryState.Full:
                    // 电池已满
                    break;
                case BatteryState.Discharging:
                case BatteryState.NotCharging:
                    // 正在放电或未充电
                    break;
                case BatteryState.NotPresent:
                    // 设备无电池(如台式机)
                    break;
                case BatteryState.Unknown:
                    // 无法检测状态
                    break;
                
            }
        }
    }
}

使用上述代码,需要Xamarin.Essential包 可以在VS for Mac 里用nutget 在线获取。

VS for mac 开发mac播放声音

复制代码
 /*
 *
 *

var player = new AudioPlayerHelper();

// 播放包内资源(假设 Resources 文件夹中有 sound.mp3)
player.PlayFromBundle("sound", "mp3");

// 或播放绝对路径文件
player.PlayFromFile("/Users/你的用户名/Music/example.mp3")

 *
 *
 *
 */

using System;
using AVFoundation;
using Foundation;

namespace helloworld1
{

    public class MacAudioPlayer
    {
        // 必须保持强引用,否则播放可能被 GC 中断
        private AVAudioPlayer _audioPlayer;

        /// <summary>
        /// 从绝对文件路径播放声音
        /// </summary>
        public void PlayFromFile(string filePath)
        {
            var url = NSUrl.FromFilename(filePath);
            Play(url);
        }

        /// <summary>
        /// 从应用程序包资源中播放声音
        /// 例如资源文件名为 "beep.mp3",放在 Resources 文件夹,Build Action 设为 BundleResource
        /// </summary>
        public void PlayFromBundle(string resourceName, string extension)
        {
            var path = NSBundle.MainBundle.PathForResource(resourceName, extension);
            if (path == null)
            {
                Console.WriteLine($"未找到资源: {resourceName}.{extension}");
                return;
            }
            var url = NSUrl.FromFilename(path);
            Play(url);
        }

        private void Play(NSUrl url)
        {
            // 如果已有播放器在播放,先停止并释放
            Stop();

            NSError error;
            _audioPlayer = AVAudioPlayer.FromUrl(url, out error);

            if (error != null)
            {
                Console.WriteLine($"AVAudioPlayer 初始化失败: {error.LocalizedDescription}");
                _audioPlayer = null;
                return;
            }

            // 配置播放参数
            _audioPlayer.Volume = 1.0f;       // 音量 0.0 ~ 1.0
            _audioPlayer.NumberOfLoops = 0;   // 0 = 播放一次,-1 = 无限循环
            _audioPlayer.FinishedPlaying += OnFinishedPlaying;

            _audioPlayer.PrepareToPlay();
            bool started = _audioPlayer.Play();
            Console.WriteLine(started ? "开始播放" : "播放失败");
        }

        private void OnFinishedPlaying(object sender, AVStatusEventArgs e)
        {
            Console.WriteLine("播放完成");
            Stop(); // 播放结束后释放
        }

        public void Stop()
        {
            if (_audioPlayer != null)
            {
                _audioPlayer.FinishedPlaying -= OnFinishedPlaying;
                if (_audioPlayer.Playing)
                    _audioPlayer.Stop();
                _audioPlayer.Dispose();
                _audioPlayer = null;
            }
        }
    }
}

在VS for Mac里开发C#代码,主要在Viewcontroller.cs文件里编写各类控件事件! 上面的代码被调用,就这样的。

Viewcontroller.cs有Viewcontorller.designer.cs的文件,这由vs for Mac自己维护,它会自动根据xcode控件变化 同步自我更新。

相关推荐
西部驯兽师12 小时前
制造企业的信息化选型课题(一)
职场和发展
天真小巫14 小时前
2026.9.28总结
职场和发展
我命由我1234514 小时前
经纪人的职业定义
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
hqyjzsb16 小时前
法律 Prompt 干货:搭建合同审查提示词要包含哪些要素
开发语言·人工智能·python·职场和发展·数据分析·prompt·业界资讯
P.D.Wei1 天前
[Leetcode 1614] 括号的最大嵌套深度
算法·leetcode·职场和发展
blxr_1 天前
力扣hot100寻找重复数https://leetcode.cn/problems/find-the-duplicate-number/
算法·leetcode·职场和发展
_不会dp不改名_1 天前
leetcode_1614嵌套括号的最大深度
算法·leetcode·职场和发展
gnsnswa1 天前
回归岗位价值:CAIE 认证适合人群与能力定位
人工智能·网络协议·职场和发展·产品经理·创业创新·信息与通信·ai写作
aqiu1111111 天前
【蓝桥杯】0仙境诅咒 — BFS/DFS 图论连通性问题(C++ 题解)
蓝桥杯·深度优先·宽度优先