You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7 macOS应用调用AXUIElementCopyAttributeValue触发EXC_BAD_ACCESS错误求助

.NET 7 macOS应用调用Accessibility Framework崩溃问题

我正在使用.NET 7.0开发macOS应用,借助Accessibility Framework(ApplicationServices -> HIServices)实现辅助功能。调用AXUIElementCopyAttributeValue()函数时,应用崩溃并抛出EXC_BAD_ACCESS (SIGSEGV)错误。

测试代码如下:

public partial class ProgramTest
{
   public void MainTest()
   {       
            AccessibilityHelper.RequestAccessibilityPermission();

            string bundleIdentifier = "com.apple.Safari";

            NSRunningApplication app = NSRunningApplication.GetRunningApplications(bundleIdentifier)?.First();

            if (app != null)
            {
                int processId = app.ProcessIdentifier;

                IntPtr appElement = AXUIElementCreateApplication((uint)processId);

                IntPtr mainWindow;
                if (AXUIElementCopyAttributeValue(appElement, kAXMainWindowAttribute, out mainWindow) == 0)
                {
                    Console.WriteLine("Main Window Handle: " + mainWindow);
                }
                else
                {
                    Console.WriteLine("Could not retrieve the main window.");
                }
            }
            else
            {
                Console.WriteLine("Application not found.");
            }
        }

        const string accessibilityFramework = "/System/Library/Frameworks/ApplicationServices.framework/Versions/Current/ApplicationServices";
        [DllImport(accessibilityFramework)]
        static extern IntPtr AXUIElementCreateApplication(uint pid);
        [DllImport(accessibilityFramework)]
        static extern int AXUIElementCopyAttributeValue(IntPtr element, string attribute, out IntPtr value);
        const string kAXMainWindowAttribute = "kAXTitleAttribute";
    }

    public static class AccessibilityHelper
    {
        public static void RequestAccessibilityPermission()
        {
            NSString key = new NSString(AXTrustedCheckOptionPrompt);
            NSDictionary options = NSDictionary.FromObjectAndKey(NSNumber.FromBoolean(true), key);

            IntPtr optionsPtr = options.Handle;
            bool isTrusted = AXIsProcessTrustedWithOptions(optionsPtr);

            if (!isTrusted)
            {
                Console.WriteLine("User denied accessibility permission.");
            }
        }

        const string accessibilityFramework = "/System/Library/Frameworks/ApplicationServices.framework/Versions/Current/ApplicationServices";
        [DllImport(accessibilityFramework)]
        static extern bool AXIsProcessTrustedWithOptions(IntPtr options);
        const string AXTrustedCheckOptionPrompt = "AXTrustedCheckOptionPrompt";
    }

已尝试的解决步骤

Info.plist配置

添加了辅助功能权限所需的键:

<key>NSAppleEventsUsageDescription</key>
<string>We need accessibility permissions to interact with other applications.</string>
<key>NSAccessibilityUsageDescription</key>
<string>We need accessibility permissions to interact with other applications.</string>

运行时请求权限

实现了RequestAccessibilityPermission()方法在运行时请求权限:

public static void RequestAccessibilityPermission()
{
    NSString key = new NSString(AXTrustedCheckOptionPrompt);
    NSDictionary options = NSDictionary.FromObjectAndKey(NSNumber.FromBoolean(true), key);

    IntPtr optionsPtr = options.Handle;
    bool isTrusted = AXIsProcessTrustedWithOptions(optionsPtr);

    if (!isTrusted)
    {
        Console.WriteLine("User denied accessibility permission.");
    }
}

自定义库

使用Xcode创建了包含AXUIElementCreateApplication(_:)和AXUIElementCopyAttributeValue(_:_:_:)方法的自定义Cocoa库,通过P/Invoke在.NET应用中调用,但仍出现相同的EXC_BAD_ACCESS (SIGSEGV)错误。

权限配置

在权限配置中禁用了沙箱:

<key>com.apple.security.app-sandbox</key>
<false/>

错误报告

-------------------------------------
Translated Report (Full Report Below)
-------------------------------------

Process:               netMacOSTest [70764]
Path:                  /Users/USER/*/netMacOSTest.app/Contents/MacOS/netMacOSTest
Identifier:            com.companyname.netMacOSTest
Version:               1.0 (1)
Code Type:             X86-64 (Translated)
Parent Process:        vsdbg-ui [70763]
Responsible:           VisualStudio [491]
User ID:               501

Date/Time:             2023-12-07 15:44:18.6174 +0100
OS Version:            macOS 14.0 (23A344)
Report Version:        12
Anonymous UUID:        E66ED467-F839-D06D-428B-00BCDEEAD568


Time Awake Since Boot: 610000 seconds

System Integrity Protection: enabled

Notes:
PC register does not match crashing frame (0x0 vs 0x10344B8E8)

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_BAD_ACCESS (SIGSEGV)
Exception Codes:       KERN_INVALID_ADDRESS at 0x0000746954584180
Exception Codes:       0x0000000000000001, 0x0000746954584180

Termination Reason:    Namespace SIGNAL, Code 11 Segmentation fault: 11
Terminating Process:   exc handler [70764]

VM Region Info: 0x746954584180 is not in any region.  Bytes after previous region: 22442082320769  Bytes before following region: 12514185690752
      REGION TYPE                    START - END         [ VSIZE] PRT/MAX SHRMOD  REGION DETAIL
      MALLOC_NANO              600000000000-600020000000 [512.0M] rw-/rwx SM=PRV  
---&gt;  GAP OF 0x1fcae3f00000 BYTES
      MALLOC_TINY              7fcb03f00000-7fcb04000000 [ 1024K] rw-/rwx SM=PRV  

Error Formulating Crash Report:
PC register does not match crashing frame (0x0 vs 0x10344B8E8)

Thread 0 Crashed::  Dispatch queue: com.apple.main-thread
0   <translation info unavailable>         0x10344b8e8 ???
1   HIServices                          0x7ff81c30f1e0 AXUIElementCopyAttributeValue + 95
2   ???                                    0x116ecfdbe ???
3   ???                                    0x116ecafd2 ???
4   ???                                    0x116ecae4a ???
5   libcoreclr.dylib                       0x10d478d89 CallDescrWorkerInternal + 124
6   libcoreclr.dylib                       0x10d478d89 CallDescrWorkerInternal + 124

请问有开发者遇到过此类问题吗?能否提供解决建议?还有哪些步骤可以帮助定位并解决该错误的根本原因?

内容的提问来源于stack exchange,提问作者Irasil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:35:56