2016-06-24 2 views
1

Я использую API для моего проекта C#. У меня также есть установщик, который настраивает исполняемый файл (с именем uEye) на версии 4.7.Обновить dll от DllImport

Моя проблема:

  • У меня есть uEye версии 4.3 на моем компьютере
  • Я начинаю мое приложение, у меня была ошибка "неправильная версия"
  • Я начинаю мои настройки
  • Setup обнаружите, что у меня нет версии 4.7
  • Он устанавливает версию 4.7
  • Я запускаю свое приложение, у меня все еще была ошибка, пока я не перезагрузился

Я использовал декомпилятор на ddl, предоставляемый API. Функция для получения версии:

public static int GetDLLVersion(out int s32Version) 
{ 
    s32Version = IntPtr.Size != 8 ?   
     uEye.Info.System.ApiWrapper.GetDLLVersion_32() : 
     uEye.Info.System.ApiWrapper.GetDLLVersion_64(); 
    return 0; 
} 

[DllImport("ueye_api_64.dll", EntryPoint = "is_GetDLLVersion")] 
private static extern int GetDLLVersion_64(); 

Интересно, не использует ли DllImport какой-то кеш? В этом случае, как я могу его обновить?

Спасибо

ответ

0

Интересно, если DllImport не использует своего рода кэш?

Существует действительно кэш. Неуправляемая DLL загружается в первый раз, когда ваше приложение вызывает функцию в этой библиотеке. В этот момент DLL загружается в ваш .net-процесс и будет оставаться загруженным до тех пор, пока этот процесс не завершится. При перезапуске процесса неуправляемая DLL снова загружается при вызове первой функции, требующей наличия DLL.

Проблема, с которой вы сталкиваетесь, заключается в том, что DLL загружается в другой процесс, когда программа установки пытается ее обновить. Когда DLL загружается в процесс, его файл не может быть изменен. Поэтому ваша программа установки не может немедленно изменить файл на диске и вместо этого отложить это обновление до следующей перезагрузки. Если ваша программа установки хорошо написана, она должна предложить пользователю перезагрузить компьютер для завершения установки.

Короче говоря, поведение здесь как ожидалось, и на самом деле очень мало того, что можно сделать. DLL просто не может быть обновлена, пока ваша программа открыта.

+0

Спасибо за ваш ответ, я добавлю сообщение, чтобы спросить перезагрузку в этом случае. –

Смежные вопросы