2009-05-06 6 views
0

Je rencontre un problème avec le mélange de code géré et non géré. J'ai créé deux projets sous une seule solution dans Visual Studio 2008 sous Vista x64 SP1. L'un d'eux n'a pas de support CLR et est une bibliothèque statique. Mon deuxième projet est compilé en tant qu'exécutable avec CLR activé. Cela dépend de la première bibliothèque statique et lui transmet les événements WinForms. Lorsque je lance l'application sans débogage, j'obtiens une exception, je mets ici les informations que je reçois de l'exception: http://pastebin.com/f46ad1211.Libération non gérée dans un exécutable géré provoquant des exceptions gérées

Voici le code du lib non géré qui est exécuté:

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(); 
} 

Je ne vois pas pourquoi je reçois un géré (System.BlahBlahBlah) exception dans une bibliothèque non gérée. Y a-t-il un moyen de séparer totalement les deux?

Répondre

1

L'exception sous-jacente est en fait une exception Windows que le CLR est en train de transformer en une exception CLR pour vous. Vous avez une violation d'accès. Ce que vous devriez pouvoir faire est, dans Visual Studio, dirigez vers Debug> Exceptions et cassez les violations d'accès. Cela devrait vous laisser tomber et voir où dans le code natif il est tout horriblement mal et commencer à diagnostiquer le problème.

+0

Merci pour l'info! L'exception est levée à la ligne 18706 de mon fichier sqlite.c, je vais essayer de trouver une solution. –

Questions connexes