Неопределенное поведение в проекте оболочки C /CLI

#c

Вопрос:

Я создал проект-оболочку C /CLI, библиотека DLL которого используется в другом проекте C . Во время сборки ошибок нет, но когда я использовал проект-оболочку в основном проекте, одна из функций проекта-оболочки работает неправильно.

например, рассмотрим функцию, написанную ниже —

 int open_device_mac_addr_native (void *param)
    {
        device ^ wrapper = DeviceLibWrapper::instance->device_obj;
        String ^ mac_new = gcnew String ((char *)param);  
        return wrapper->open_device (mac_new);
    }
 

Когда я пытаюсь запустить основную программу (которая вызывает функцию, упомянутую выше), я получаю «Ошибка Windows 0xe0434352». Когда я вставляю a return 1 в качестве первой строки в функцию, как показано ниже —

 int open_device_mac_addr_native (void *param)
    {
        return 1;
        device ^ wrapper = DeviceLibWrapper::instance->device_obj;
        String ^ mac_new = gcnew String ((char *)param);  
        return wrapper->open_device (mac_new);
    }
 

Он все еще пытается выполнить всю функцию, и я получаю ту же ошибку «Ошибка Windows 0xe0434352». Однако, когда я комментирую всю часть функции , кроме первой return 1 , функция возвращается нормально.

Это совершенно сбивает меня с толку. Было бы действительно заметно, если бы кто-нибудь мог поделиться некоторыми соображениями о первопричине этой проблемы и направить меня к возможным решениям. Кроме того, я хотел бы понять , почему функция не возвращается в первую return 1 очередь и пытается выполнить все тело, несмотря return 1 на то, что это первая инструкция.

С жестом благодарности.

Сартак Малик.

Комментарии:

1. Я удалил ваши ссылки на Visual Studio 2019, потому что это не вопрос об использовании приложения Visual Studio. Если вы намеревались пометить конкретную версию .NET, пожалуйста, сделайте это вместо этого, так как это говорит нам больше, чем просто о том, какую среду разработки вы используете.

2. Это может быть проблемой устаревших зависимостей. Если вы поставите return 1 , то остальная часть функции не должна выполняться. Я предполагаю, что ваш другой проект каким-то образом подобрал старую версию вашей библиотеки DLL (или где-то ее кэшировал), или вы забыли перестроить свой проект после внесения изменений в код, или не сохранили изменения кода. При комментировании вы затем (неявно) перестроили и обновили зависимость, чтобы измененный код вступил в силу.

3. 0xe0434352 сообщает вам, что код C /CLI вызвал необработанное исключение. В этом нет ничего необычного, управляемый код любит создавать исключения, когда что-то идет не так. Вы просто не знаете, что пошло не так, в машинном коде нет дружественной поддержки, которая сообщала бы подробности об исключении. Настоятельно рекомендуется провести управляемый модульный тест. Или используйте отладчик в собственном проекте: Проект > Свойства >> Отладка >>> «Тип отладчика» = Смешанный и отладка >>>> Windows >>>>> Настройки исключений > > > > > > отметьте исключения CLR.