Необработанное исключение в 0x7537812f в Sample.exe: 0xC0020001: недопустимая привязка строки [duplicate]

0

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

Необработанное исключение в 0x7537812f в Sample.exe: 0xC0020001: привязка строки недействительна

Мое приложение представляет собой форму Windows, написанную на С# в Visual Studio 2012 Professional, и программа использует некоторые собственные функции из dll, которые написаны на C. Я исследовал в Интернете, но почти все решения не используют статические переменные или компилируют dll с /clr в Visual Studio для C++, но моя dll - код C от третьей стороны, и она построена MingGW, поэтому я не могу следовать этим решениям. Изменение статических переменных невозможно.

Пожалуйста, помогите мне найти решение для этого?

  • 0
    Не могли бы вы показать код, где было сгенерировано исключение? А подпись внешней функции?
  • 0
    Ваше предположение, что это вызвано кодом C, не может быть правильным, это исключение C ++ / CLI. Вы должны показать неуправляемый стек вызовов, чтобы сделать ваш вопрос заслуживающим доверия. Включите неуправляемую отладку, чтобы получить ее.
Теги:

1 ответ

0

Без кода трудно сказать, в чем проблема. Но когда вы говорите, что крах случается (иногда) во время закрытия приложения, вы, вероятно, не можете легко предоставить правильный фрагмент кода.

Причинами могут быть: в некотором коде программы используются некоторые данные, которые уже уничтожены. Если внутренняя реализация вашей DLL - это C++, например, деструктор может получить доступ к уже удаленным данным или создать статически перед экземпляром класса. Это будет означать, что DLL вызывает сбои внутри. Для этого объяснения, вызвавшего какую-то закрытую функцию API, могут быть единственной помощью.

Другая причина, возможно, вы создаете DLL в классе С#, который уничтожается в сборке мусора. Поскольку экземпляры уничтожаются "неконтролируемыми", они могут вызывать уже выгруженный DLL API. Флаг, сигнализирующий о действительности DLL API, поможет в этом.

Поэтому мое предложение:

  • Проверьте, если ваша DLL предоставляет функцию API для закрытия или очистки или разгрузки - вызовите ее и не вызывайте после этого никакой другой функции API из DLL. Используйте, например, глобальный флаг tor и доступ к DLL, только если флаг позволяет это. (плохой подход к человеку, лучше - инкапсулировать DLL в классе С#)

  • Попробуйте загрузить и выгрузить DLL в любой тестовой функции вашего С#, чтобы сделать ошибку более простой в воспроизведении.

  • Убедитесь, что, когда ваш С# начинает процесс закрытия, чтобы больше не вызывать какую-либо функцию DLL (за исключением того, что один раз вызывал clean/close/unload)

Надеюсь, поможет.

  • 0
    Я стараюсь следовать вашему руководству, но оно все еще не решено. Я думаю, что это исключение возникло при использовании статической переменной в программе на Си, но я не могу удалить все статические переменные в исходном коде Си. У вас есть другое решение?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню