Сбой программы при входе в функцию с вызовом DLL - PullRequest
0 голосов
/ 04 мая 2011

Код:

private void button1_Click(object sender, RoutedEventArgs e)
{
   MessageBox.Show("Enters a button click");
   // Create our OpenGL Hwnd 'control'...
   HwndHost host = new WPFOpenGLLib.OpenGLHwnd();

   // ... and attach it to the placeholder control:
   hwndPlaceholder.Child = host;
}

WPFOpenGLLib.OpenGLHwnd() - это класс в C ++ DLL.Я добавил ссылку на эту DLL в своем приложении C # WPF.Но когда я нажимаю button1 приложение вылетает.Даже блок сообщений с »Вводит нажатие кнопки« не показывает.Даже когда я использую

bool a = false;
if (a)
{
   // Create our OpenGL Hwnd 'control'...
   HwndHost host = new WPFOpenGLLib.OpenGLHwnd();

   // ... and attach it to the placeholder control:
   hwndPlaceholder.Child = host;
}

, он вылетает.

Кстати, на одном компьютере (где я пишу приложение) (Win7 32bit) все работает нормально, на другом компьютере (Win7 64bit) он дает сбой, и на другом компьютере (Win7 32bit) также происходит сбой.

Кто-нибудь знает, в чем здесь проблема?

Ответы [ 3 ]

0 голосов
/ 04 мая 2011

Звучит, скорее всего, из-за некоторой путаницы в архитектуре, которая вызывает проблемы. Используете ли вы 64-разрядную версию библиотеки в 64-разрядной системе или пытаетесь использовать 32-разрядную? В дальнейшем перейдите в свойства проекта (вашего проекта C #) и установите целевой ЦП на x64 (по умолчанию это должно быть Any CPU). При настройке по умолчанию ваш проект будет выполняться 64-битной виртуальной машиной и, следовательно, не сможет загрузить 32-битную библиотеку.

Как только это будет сделано, убедитесь, что на всех системах установлены правильные зависимости. Например. Я думаю, что Microsoft никогда не меняла поведение приложений .net, просто сбой, если отсутствуют правильные файлы времени выполнения. Если и это не решит проблему, скорее всего, в коде инициализации файла DLL есть какая-то ошибка (или другая причина сбоя).

0 голосов
/ 26 января 2012

Я понимаю, что это старая, мертвая нить, но если кто-то еще посмотрит на это -

У меня есть приложение на C #, которое использует DLL (нативный код / ​​clr). Когда я запускаю приложение БЕЗ DLL, оно открывается нормально, и все выглядит прекрасно, пока вы не нажмете кнопку, которая фактически вызывает функцию DLL. Затем программа вылетает, как описано в этом вопросе. Мне кажется, что у ОП могут быть библиотеки DLL на его компьютере разработчика, но на других, загадочных компьютерах их нет. Итак, программа работает и, кажется, работает, пока не будет выполнен вызов DLL.

Я искал вокруг, чтобы посмотреть, как проверить все необходимые библиотеки DLL при запуске, и наткнулся на этот вопрос. Нативное приложение C ++ даже не запустится, если не найдены все необходимые библиотеки DLL. Является ли C # «отложенной загрузкой», это DLL? Может быть.

0 голосов
/ 04 мая 2011

Некоторое время я не делал ничего из OpenGL (раньше делал это в C ++ и win32 года назад), но Hwnd - это дескриптор окна, и, как и большинство вещей в C ++, это просто адрес памяти для окна, и как 64-битный изменяет размер указателя по умолчанию. Я предполагаю, что либо используемая вами библиотека, действующая от имени C ++ в управляемой среде, не настроена на работу с 64-битными системами.

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