Я пытаюсь найти способ отладки моего приложения, но для меня это очень сложно. Ошибка при закрытии программы, иногда она показывает код ошибки, как показано ниже:
Необработанное исключение в 0x7537812f в Sample.exe: 0xC0020001: привязка строки недействительна
Мое приложение представляет собой форму Windows, написанную на С# в Visual Studio 2012 Professional, и программа использует некоторые собственные функции из dll, которые написаны на C. Я исследовал в Интернете, но почти все решения не используют статические переменные или компилируют dll с /clr
в Visual Studio для C++, но моя dll - код C от третьей стороны, и она построена MingGW, поэтому я не могу следовать этим решениям. Изменение статических переменных невозможно.
Пожалуйста, помогите мне найти решение для этого?
Без кода трудно сказать, в чем проблема. Но когда вы говорите, что крах случается (иногда) во время закрытия приложения, вы, вероятно, не можете легко предоставить правильный фрагмент кода.
Причинами могут быть: в некотором коде программы используются некоторые данные, которые уже уничтожены. Если внутренняя реализация вашей DLL - это C++, например, деструктор может получить доступ к уже удаленным данным или создать статически перед экземпляром класса. Это будет означать, что DLL вызывает сбои внутри. Для этого объяснения, вызвавшего какую-то закрытую функцию API, могут быть единственной помощью.
Другая причина, возможно, вы создаете DLL в классе С#, который уничтожается в сборке мусора. Поскольку экземпляры уничтожаются "неконтролируемыми", они могут вызывать уже выгруженный DLL API. Флаг, сигнализирующий о действительности DLL API, поможет в этом.
Поэтому мое предложение:
Проверьте, если ваша DLL предоставляет функцию API для закрытия или очистки или разгрузки - вызовите ее и не вызывайте после этого никакой другой функции API из DLL. Используйте, например, глобальный флаг tor и доступ к DLL, только если флаг позволяет это. (плохой подход к человеку, лучше - инкапсулировать DLL в классе С#)
Попробуйте загрузить и выгрузить DLL в любой тестовой функции вашего С#, чтобы сделать ошибку более простой в воспроизведении.
Убедитесь, что, когда ваш С# начинает процесс закрытия, чтобы больше не вызывать какую-либо функцию DLL (за исключением того, что один раз вызывал clean/close/unload)
Надеюсь, поможет.