C# аварийно завершает работу после вызова библиотеки C++/CLI через таймер x64C#

Место общения программистов C#
Ответить
Anonymous
 C# аварийно завершает работу после вызова библиотеки C++/CLI через таймер x64

Сообщение Anonymous »

У меня есть 2 класса Windows WPF. Давайте назовем их классом A и классом B.
Оба A и B имеют элемент управления веб-браузером.
Оба A и B вызывают общий метод из C++. /CLI DLL для печати пользовательского верхнего и нижнего колонтитула по ссылке ниже:
https://www.limilabs.com/blog/printing- ... nd-footerИ A, и B выполняют один и тот же код printFromWebBrowser(), однако метод вызова различен.
Класс A хорошо работает как на x86, так и на x64, но срабатывает триггер. нажатием кнопки распечатка получается успешно и без сбоев.
Класс B хорошо работает на x86, но вылетает на x64.
В классе B при открытии окна есть фоновый рабочий, который будет получать данные и загружать информацию в элемент управления веб-браузером, я проверил, данные успешно загружены, и фоновый рабочий завершил задание перед запуском таймера.
После веб-браузер завершил загрузку, таймер запустится и через x секунд вызовет общий метод
Я знаю, что есть разница между IntPtr на машинах x86 и x64, однако я не уверен, почему это работает ну, и не происходит сбоя в классе A, когда я вызывал тот же метод, если это действительно была проблема IntPtr, за исключением того, что триггер теперь автоматизирован, а не запускается пользователем.
Чтобы добавить, проект C# целевая платформа — x86, проект C++/CLI настроен на Win32.
Любые идеи по дальнейшему развитию будут оценены по достоинству.
Спасибо
Фрагмент кода ниже
Общий код
private void printFromWebBrowser()
{
try
{
IntPtr ptr = Marshal.GetComInterfaceForObject(
webBrowser1.axIWebBrowser2,
typeof(IWebBrowser2));

string header = " Custom header ";
string footer = " Custom Footer";

PrintHelper.Print(ptr, header, footer);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine + Environment.NewLine + ex.InnerException.Message + Environment.NewLine + ex.InnerException.StackTrace);
}
}

Работник класса B завершил цепочку
private void printWorker_RunWorkerCompleted(object s, RunWorkerCompletedEventArgs args)
{
if (canPrint)
{
webBrowser1.Navigate(docURL);
}
else
{
System.Windows.MessageBox.Show(errorMsg, "Error Printing Document", MessageBoxButton.OK, MessageBoxImage.Exclamation);
this.Close();
}
}

Документ веб-браузера класса B завершен, только после этого запустите таймер
private void WB_OnDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (this.webBrowser1.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
return;
else
{
timer1.Start();
}
}

Тик таймера класса B
void timer1_Tick(object sender, EventArgs e)
{
counter++;//some counter to wait for number of ticks
if (counter >= x) //x is a global class variable defined
{
timer1.Stop();
printFromWebBrowser();
this.Close(); //close after printing
}
}


Подробнее здесь: https://stackoverflow.com/questions/451 ... -timer-x64
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»