У меня есть 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
C# аварийно завершает работу после вызова библиотеки C++/CLI через таймер x64 ⇐ C#
Место общения программистов C#
1727715099
Anonymous
У меня есть 2 класса Windows WPF. Давайте назовем их классом A и классом B.
Оба A и B имеют элемент управления веб-браузером.
Оба A и B вызывают общий метод из C++. /CLI DLL для печати пользовательского верхнего и нижнего колонтитула по ссылке ниже:
https://www.limilabs.com/blog/printing-in-webbrowser-control-custom-header-and-footerИ A, и B выполняют один и тот же код printFromWebBrowser(), однако метод вызова различен.
Класс A хорошо работает как на x86, так и на x64, но срабатывает триггер. нажатием кнопки распечатка получается успешно и без сбоев.
Класс B хорошо работает на x86, но вылетает на x64.
В классе B при открытии окна есть фоновый рабочий, который будет получать данные и загружать информацию в элемент управления веб-браузером, я проверил, данные успешно загружены, и фоновый рабочий завершил задание перед запуском таймера.
После веб-браузер завершил загрузку, таймер запустится и через x секунд вызовет общий метод
Я знаю, что есть разница между IntPtr на машинах x86 и x64, однако я не уверен, почему это работает ну, и не происходит сбоя в классе A, когда я вызывал тот же метод, если это действительно была проблема IntPtr, за исключением того, что триггер теперь автоматизирован, а не запускается пользователем.
Чтобы добавить, проект C# целевая платформа — x86, проект C++/CLI настроен на Win32.
Любые идеи по дальнейшему развитию будут оценены по достоинству.
Спасибо
Фрагмент кода ниже
[b]Общий код[/b]
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]Работник класса B завершил цепочку[/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]Документ веб-браузера класса B завершен, только после этого запустите таймер[/b]
private void WB_OnDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (this.webBrowser1.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
return;
else
{
timer1.Start();
}
}
[b]Тик таймера класса B[/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
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/45167883/c-sharp-crashes-after-invoking-c-cli-library-through-timer-x64[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия