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. 这两个软件因为适配,就会同步更新两边的更改

微软的一步步教的步骤 : https://learn.microsoft.com/zh-cn/previous-versions/xamarin/mac/get-started/hello-mac


在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控件变化 同步自我更新。