2009-05-06 129 views
0

我在混合託管代碼和非託管代碼時遇到問題。我在Vista x64 SP1下的Visual Studio 2008中的單個解決方案下創建了兩個項目。其中一個沒有CLR支持,並且是一個靜態庫。我的第二個項目被編譯爲啓用了CLR的可執行文件。它依賴於第一個靜態庫,並將WinForms事件傳遞給它。託管可執行文件中的非託管庫導致託管異常

當我在沒有調試的情況下啓動應用程序時,出現異常,我把這些異常信息從http://pastebin.com/f46ad1211中取出。

這裏是運行的非託管的lib代碼:

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

底層的異常實際上是一個Windows異常,CLR顯然已經變成了CLR異常。您有訪問衝突。你應該能夠做的是,在Visual Studio中,前往調試>例外,並打破訪問違規。這應該讓你放下來,看看它的本地代碼中哪裏出了所有可怕的錯誤,並開始診斷問題。

+0

感謝您的信息!我的sqlite.c文件的第18706行引發了異常,我會試着弄清楚如何解決這個問題。 – 2009-05-06 02:26:19