Проблема состоит в том, что этот конроль может инициироваться только в single threading apartment. В моей же программе используются несколько потоков.Так вот, в определенный момент необходимо открыть форму с WebBrowser контролем на ней и окрыть заданную пользователем веб страницу. В многопоточном режиме WB ругается и выбивает программу.
Для обхода, я использовал новый поток, который я вручную перевожу в однопоточный режим, запускаю его и жду его окончания.
Dim t As New Thread(AddressOf ShowDlgThreadProc)
t.SetApartmentState(ApartmentState.STA)t.Start()
t.Join()
Фунция потока выглядит так
Private Sub ShowDlgThreadProc()
Dim dlg As New frmWebBrowser
Dim retVal As EnumExecStatus = EnumExecStatus.Passeddlg.URL = URL
If (dlg.ShowDialog() = DialogResult.Cancel) Then retVal = EnumExecStatus.Failed
dlg.Dispose()
dlg = Nothing
ExecutionStatus = retVal
End Sub
Все работает прекрасно, форма открывается, необходимая веб страница показывается, но ...
...Если пользователь вводит вместо веб адреса, к примеру, локальный путь к директории (например C:\TEMP), то тут возникает проблема. С точки зрения WebBrowser это верный путь и он способен его показать. Если пользователь не выделяет или, тем более, не пытается открыть какой нибудь файл, то после закрытия формы поток заканчивает свою работу правильно и ошибок не возникает.
Но стоит пользователю просто кликнуть один раз внутри WB, то после закрытия формы и окончания функции выбрасывается сообщение об ошибке и дальнейшее выполнение программы невозможно.
Ошибка такая
No symbols are loaded for any call stack frame. The source code cannot be displayed.
После закрытия этого сообщения в IDE появляется окно Exception со следующим текстом.
LoaderLock was detected
Message: Attempting managed execution inside OS Loader lock. Do not attempt to run managed code inside a DllMain or image initialization function since doing so can cause the application to hang.
Из IDE можно нажать Продолжить и закончить работу правильно, но при самостоятельном выполнении программы на этом все и заканчивается.
Вопросы будут такие
1. Возможно ли другим способом (отличным от приведенного выше) использования этого объекта в много-поточном приложении?
2. Как и где можно попытаться отловить эту ошибку/исключение, чтобы в любом случае продолжить нормальную работу?
3. Если не 1 или 2, то как можно ограничить доступ к локальным директориям для WB контроля?
Спасибо