У меня есть следующий класс, который создает экземпляр моего 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-разрядных.