Неуправляемая библиотека в управляемом исполняемом файле, вызывающая управляемые исключения - PullRequest
0 голосов
/ 06 мая 2009

У меня проблема со смешиванием управляемого и неуправляемого кода. Я создал два проекта в рамках одного решения в Visual Studio 2008 под Vista x64 SP1. Один из них не имеет поддержки CLR и является статической библиотекой. Мой второй проект скомпилирован как исполняемый файл с включенным CLR. Он зависит от первой статической библиотеки и передает ей события WinForms.

Когда я запускаю приложение без отладки, я получаю исключение и помещаю информацию, полученную из исключения, здесь: http://pastebin.com/f46ad1211.

Вот код запуска неуправляемой библиотеки:

void manager::init() // <-- Called from the .exe project
{
    this->log.open("C:\\development\\log.txt");
    this->storage = storage_manager(&(this->log), &(this->settings));
    this->storage.load_settings();
}

&

void storage_manager::load_settings()
{
    this->error_check(sqlite3_open("settings.db", &(this->db_settings_p)));
    sqlite3_stmt* read_settings;
    this->error_check(sqlite3_prepare_v2(this->db_settings_p, "SELECT name, value FROM settings", 1024, &read_settings, NULL));

    int step_code;
    std::string name;
    std::string value;
    while(true)
    {
        step_code = sqlite3_step(read_settings);
        if(step_code == SQLITE_DONE)
        {
            break;
        }
        else if(step_code == SQLITE_ROW)
        {
            name = std::string(reinterpret_cast<const char*>(sqlite3_column_text(read_settings, 0)));
            value = std::string(reinterpret_cast<const char*>(sqlite3_column_text(read_settings, 1)));
            (*(this->settings))[name] = value;

        }
        else
        {
            this->error();
        }
    }
    sqlite3_reset(read_settings);
    sqlite3_finalize(read_settings);
}

&

void storage_manager::error_check(int rc)
{
    if(rc)
    {
        this->error();
    }
}
void storage_manager::error() //Sure of error
{
    std::string error_msg;
    error_msg = "Storage Manager: SQLite Error (";
    error_msg += sqlite3_errcode(this->db_p);
    error_msg += ") - ";
    error_msg += sqlite3_errmsg(this->db_p);
    this->log->write(error_msg.c_str(), error_msg.length());
    this->log->flush();
}

Не могу понять, почему я получаю управляемое (System.BlahBlahBlah) исключение в неуправляемой библиотеке. Есть ли способ заставить эти два быть полностью отделенными?

1 Ответ

1 голос
/ 06 мая 2009

Основное исключение на самом деле является исключением Windows, которое, по-видимому, превращает CLR в исключение CLR для вас. У вас есть нарушение прав доступа. Что вы должны уметь делать, так это в Visual Studio перейти к «Отладка»> «Исключения» и устранить нарушения при доступе. Это должно позволить вам заглянуть и увидеть, где в нативном коде все ужасно неправильно, и начать диагностику проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...