C # WindowsAccessBridge - AccessBridge.CreateAccessibleWindow вызывает SystemViolationException - PullRequest
0 голосов
/ 11 июля 2019

У меня есть следующий класс, который создает экземпляр моего Java-приложения:

private AccessBridgeFunctions _javaFunctions;
private AccessBridge _javaBridge;
private readonly ConcurrentDictionary<IntPtr, AccessibleWindow> _openWindows;
private List<AccessibleJvm> _javaApplications;

internal JavaApplication()
{
    _javaBridge = Factory.CreateAccessBridge();
    _javaBridge.Initialize();

    Thread.Sleep(10000); //added time here as I thought it would solve the issue
    Task task = Task.Factory.StartNew(() => GetJavaWindows());
    while (task.Status != TaskStatus.RanToCompletion)
    {
        Application.DoEvents();
        Thread.Sleep(500);
    }
    _javaApplications = GetJavaWindows();

    _javaFunctions = _javaBridge.Functions;
}

private List<AccessibleJvm> GetJavaWindows()
{
    return _javaBridge.EnumJvms(hwnd => GetOrAddCache(_javaBridge, hwnd));
}

private AccessibleWindow GetOrAddCache(AccessBridge accessBridge, IntPtr hwnd)
{
    return _openWindows.GetOrAdd(hwnd, key => accessBridge.CreateAccessibleWindow(key));
}

Что этот класс делает, так это получает все запущенные программы моего ПК и создает объект AccessibleWindow, если запущенная программа является Java-программой.

Проблема иногда в том, что я сталкиваюсь с SystemViolationException в этом методе здесь:

private AccessibleWindow GetOrAddCache(AccessBridge accessBridge, IntPtr hwnd)
{
    return _openWindows.GetOrAdd(hwnd, key => accessBridge.CreateAccessibleWindow(key));
}

В частности:

accessBridge.CreateAccessibleWindow (key);

У меня нет снимка экрана с исключением, поскольку это происходит не всегда, но говорится, что я читаю поврежденную память .

Есть ли конкретная причина, по которой возникает эта проблема, и есть ли способ предотвратить ее возникновение?Я не уверен, является ли это виновником, но, пожалуйста, обратите внимание, что я использую WindowsAccessBridge.dll для 32-разрядных, в то время как моя машина в настоящее время работает в 64-разрядных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...