Вопрос о функции C# invoke C++
когда я использую dllimport для вызова функции C++, как показано ниже:
[DllImport("Test.dll", EntryPoint = "Init", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static extern int Init();
я использую эту функцию несколько месяцев, после чего добавляю одну строку кода в Init, как показано ниже:
A* a = new A();
когда я использую VS2010 debug Run model-это нормально,но когда я использую двойной щелчок для запуска exe,он выдает ошибку:
Try to read or write protected memory. This usually indicates that other memory is corrupt
я не могу найти никаких проблем в коде, очень запутался.
так что опубликуйте этот вопрос и надеюсь, что кто-то встретил тот же вопрос и поможет мне его решить.
Спасибо!
Что я уже пробовал:
Я добавляю два messagebox как показано ниже:
MessageBox(NULL,"111111!","OK!",MB_OK | MB_ICONINFORMATION); A* a = new A(); MessageBox(NULL,"222222!","OK!",MB_OK | MB_ICONINFORMATION);
так что скомпилируйте код проекта и дважды щелкните EXE,"111111 "может всплыть,но" 22222 " не может быть.
поэтому я уверен, что в новом A() должна быть какая-то ошибка.
Функция класса consturct, как показано ниже:
A::A() { MessageBox(NULL,"333333!","OK!",MB_OK | MB_ICONINFORMATION); ctx = new des_context(); ctx3 = new des3_context(); bDESKeyExists = false; bDES3KeyExists = false; }
я не вижу всплывающего окна "333333", очень запутываюсь, не могу найти вопрос.
Sergey Alexandrovich Kryukov
Недостаточно информации. Исключение, скорее всего, брошено на неуправляемую часть.
Хуже всего то, что вы не разрушаете A* a. А ты знаешь delete a
куда-нибудь?
—СА
xuyunhai
я не разрушаю A* a, просто чтобы найти вопрос,поэтому добавьте messagebox во всплывающее окно "333333", но оно не может всплывать "333333", поэтому я очень запутан и не могу найти вопрос.
Sergey Alexandrovich Kryukov
Я вижу это, но это все еще проблема. Вы собираетесь удалить а?
—СА
xuyunhai
нет, a должен существовать, потому что после new A () я использую много функций в классе.
Sergey Alexandrovich Kryukov
Все неправильно. Каждое новое должно сопровождаться удалением. Это зависит от разных факторов, где его удалить, но вы не можете его оставить. Это неправильный дизайн кода в целом. Пожалуйста, устраните эту проблему.
—СА
xuyunhai
после того,как я создаю A () и когда оставляю функцию init,я использую delete A, чтобы избавиться от нее.
Sergey Alexandrovich Kryukov
Лучше...
—СА
xuyunhai
зачем использовать vs2010 отладки модальные хорошо,но соблюдение exe и дважды щелкните сообщение об ошибке?
Sergey Alexandrovich Kryukov
"отладочный модальный"? Что ты имеешь в виду?
Кто вам сказал, что в "Debug" вы не "компилируете exe"?
—СА
xuyunhai
Я имею в виду, что в vs2010 я нажимаю клавишу F5 для запуска проекта
Sergey Alexandrovich Kryukov
Я понимаю. Пожалуйста, какая разница, что вы нажимаете? Он строит проект, при необходимости создает все сборки, которые должны быть построены, включая ваш файл .exe, и выполняет его под отладчиком. Вы можете запустить, что .exe в "отладки", а не .exe в "освобождении", или любой другой конфигурации. Попробуйте запустить этот файл. exe напрямую, без отладчика. Что же происходит?
Вы используете резьбу? Я спрашиваю, потому что различное поведение в разных конфигурациях относительно редко и является признаком более глубоких проблем. Возможно ли, что ваш код отличается от него с помощью препроцессора?
—СА
xuyunhai
я уверен,что это должно быть в неуправляемой части, потому что функцию init я использовал несколько месяцев.
George Jonsson
Как вы скомпилировали свою неуправляемую библиотеку DLL? Как нарушением соглашения о стандартном или ключевое слово cdecl?
Точно так же, как эксперимент установил CallingConvention = CallingConvention.Нарушением соглашения о стандартном в код атрибута DllImport.
xuyunhai
я пытался, но потерпел неудачу, вопрос всегда существует.
George Jonsson
Вы имеете в виду ошибку, я полагаю.
Что ж, не так-то просто оказать еще какую-нибудь помощь.
Вы пробовали удалить код внутри конструктора класса А?
Подобный этому
ЛЯ()
{
}
Потому что вы создаете там какие-то новые указатели из неизвестных классов.
Richard MacCutchan
Вы не показали нам код в функции Init, которая, по-видимому, является местом возникновения исключения.
Philippe Mori
Все ли окна сообщений отображаются из функции Init?
Как уже указывали другие, вы предоставляете недостаточно информации. В частности, было бы полезно иметь реализацию Init (а также указать, какой код находится в C# и в C++).
Одна из идей заключается в том, что существует несоответствие в соглашении о вызове для вашей функции Init, но это будет зависеть от того, как объявлен Init и, возможно, от ваших параметров компилятора...
KarstenK
Есть ли у вашего класса а некоторые члены, которые могут вызвать эту проблему?