xuyunhai Ответов: 1

Вопрос о функции 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

Есть ли у вашего класса а некоторые члены, которые могут вызвать эту проблему?

1 Ответов

Рейтинг:
0

KarstenK

Похоже, что у конструктора A () есть некоторые проблемы. Это дочерний класс, и его родитель имеет проблему или, может быть, некоторые конструкторы членов класса.

Сообщение об ошибке звучит так, как будто некоторые операции чтения/записи в мусорную память или указатели выполнены.

Построения() в качестве отладочного построения и использования отладчика с "шагом" по() конструктор. Это работает!!!


Richard MacCutchan

Посмотрите на дату вопроса.