Использование win32 в управляемом коде - PullRequest
1 голос
/ 09 июля 2009

Я использую WPF уже несколько лет и не имею никакого опыта ни с чем, кроме управляемого кода. Я начал писать приложение, которое использует много win32-взаимодействий, и мне стало интересно, у меня ли утечка памяти или я вообще делал что-то глупое, о чем я не знал ... Так что я подумал, что буду искать советы!

Есть ли какие-либо ошибки / советы / хитрости при использовании вызовов win32 внутри управляемого кода? Меня больше всего интересует память / сборка мусора, но любые другие советы приветствуются!

Ответы [ 4 ]

4 голосов
/ 09 июля 2009

Нету ошибок. Вы освобождаете все ресурсы, которые вы выделяете (если в документации не указано, что ваш звонок захватывает ресурс, освобождает вас от владения), и это все, что нужно сделать. GC вообще не вступает в это.

В качестве подсказки, System.Runtime.InteropServices.SafeHandle - это стандартный вспомогательный класс для использования дескрипторов Win32 в стиле RAII.

3 голосов
/ 09 июля 2009

Почти ресурс, который вы выделяете в Win32, должен быть освобожден с помощью правильного вызова API, который задокументирован на странице MSDN для API выделения.

Это полностью ручной процесс; Сборка мусора не помогает в этом, хотя вы можете использовать SafeHandle или (в крайнем случае) финализаторы.

Как минимум, используйте IDisposable классы-оболочки для любых ресурсов, которые вы выделяете. В некоторых случаях они уже существуют в Windows Forms.

Вы можете использовать Perfmon или диспетчер задач, чтобы отслеживать количество ручек, открытых в вашем процессе.

1 голос
/ 09 июля 2009

Вы должны быть немного осторожны, если вам нужно вызвать GetLastError , чтобы определить, почему произошел сбой вызова win32. Эта страница содержит подробное описание.

1 голос
/ 09 июля 2009

Основная проблема с win32-взаимодействием - это (очевидно) несовместимость с Linux / Mac OS (Mono не сможет вам помочь, если у вас есть P / вызывает библиотеки win32).

Кроме того, я не знаю никаких проблем. Если, конечно, сама функция, которую вы вызываете, не утечка памяти.

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