.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 ---> 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
相关产品推荐
相关产品推荐

