Как защитить импортированную Win32 DLL в .NET-приложение от проблем с памятью - PullRequest
0 голосов
/ 15 мая 2010

У меня есть приложение на C #, которое должно использовать устаревшую библиотеку Win32 DLL. DLL является почти собственным приложением, имеет диалоги, операции с оборудованием и т. Д. Когда эта DLL импортируется и используется, возникает пара проблем:

  1. Перетаскивание диалога (не Windows системный диалог, но созданный DLL) через приложение управляемого кода заставляет пользовательский интерфейс не перекрашивать. Далее он генерирует систему из исключение памяти из различных интерфейсов управление.
  2. Производительность невероятно медленно.
  3. Кажется, нет никакого способа выгрузить DLL, чтобы память никогда не очищается. Когда мы закрываем наши управляемое приложение, мы получаем другую память исключение.

В данный момент мы импортируем каждый вызов метода как таковой:

[DllImport("dllname.dll",
    EntryPoint = "MethodName", SetLastError = true,
    CharSet = CharSet.Auto, ExactSpelling = true,
    CallingConvention = CallingConvention.StdCall)]

1 Ответ

1 голос
/ 15 мая 2010

Я бы создал упаковщик exe (возможно, неуправляемый), который предоставляет API для вашего нового приложения.

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

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