утечка памяти при вызове неуправляемого кода из управляемого кода в Windows 7

Вы хотите установить почтовое расширение плагин. Это позволит Вам настраивать почтовые уведомления для каждой сборки.

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

7
задан Meidan Alon 7 December 2011 в 13:29
поделиться

4 ответа

Я уверен, что проблема связана с маршалингом типов данных C # на их противоположные части C ++. Поскольку вы маршалируете возвращаемое значение bool в однобайтовое значение со знаком, может быть, вам следует сделать то же самое с аргументами функции? Тип bool в C # составляет 4 байта, может быть, у вас утечка?

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

[DllImport(DllPath, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool MyMethod(
        int x,
        [MarshalAs(UnmanagedType.LPWStr)]
        [In] string y,
        [MarshalAs(UnmanagedType.LPWStr)]
        [In] string z,
        [MarshalAs(UnmanagedType.I1)]
        bool v,
        [MarshalAs(UnmanagedType.I1)]
        bool w);

Объяснение для комментатора:

Для типа bool C ++:

Как правило, нулевой или нулевой указатель значение конвертируется в false, любое другое значение преобразуется в истину.

...

Стандартная библиотека C ++ 1998 определяет специализация вектора шаблон для bool. Описание класс указывает, что реализация должна содержать элементы, так что каждый bool использует только один бит памяти.

Таким образом, практически какое бы значение вы ни использовали, вы получите логическое значение C ++ со значением true или false.

5
ответ дан 7 December 2019 в 05:25
поделиться

К сожалению, когда вы задействуете строки, упростить сортировку не получится.

Нам понадобятся дополнительные данные, чтобы помочь вам отследить эту проблему. Можете ли вы предоставить следующую

  • Подпись собственного метода
  • Как память для строк управляется в машинном коде?
  • Возможно, пример C ++, в котором вы используете API?

РЕДАКТИРОВАТЬ

Попробуйте следующую подпись . Это говорит CLR не маршалировать память в обоих направлениях, а вместо этого только передавать данные.

    [DllImport(DllPath, CharSet = CharSet.Unicode)]
    [return: MarshalAs(UnmanagedType.I1)]
    public static extern bool MyMethod(
            int x, 
            [In] string  y, 
            [In] string  z, 
            bool    v, 
            bool    w);
2
ответ дан 7 December 2019 в 05:25
поделиться

Я обнаружил, что использование CLR Profiler помогает при обнаружении утечки памяти.

1
ответ дан 7 December 2019 в 05:25
поделиться

Вы уверены, что существует утечка памяти?

На основании чего вы определяете утечку памяти. Вы говорите, что можете видеть это по счетчикам производительности, но что вы на самом деле наблюдаете? Вы видите постоянно растущую кривую или кривую, которая достигает высокого уровня? Высокое потребление памяти часто принимают за утечку памяти.

btw. Можете ли вы опубликовать определение функции C ++?

0
ответ дан 7 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: