C# interop dll C, comment charger une structure

dirthangel Messages postés 19 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 19 juin 2007 - 18 mai 2007 à 17:58
tomlev Messages postés 25 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 28 août 2007 - 20 mai 2007 à 16:09
Salut a tous je developpe actuellement un programme C# utilisant SQLite, j'ai téléchargé un wrapper pour la version 1.5 , que j'ai modifié pour utiliser la version 3.x :), mais voila j'ai un soucie pour ouvrir une base SQLite 3.x il faut fournir un handler de db de type sqlite3 ce type etant une structure définit comme suit (j'ai ajouté le extern) :
 
extern typedef struct sqlite3 sqlite3;

dans la doc d'sqlite l'exemple en C montre
sqlite3 *db; //  on défnit un objet de type sqlite
sqlite3_open("nomdb", &db);

ma question est donc simple comment faire cela en C# ? j'utilise DLLimport pour les fonctions mas je sais pas comment faire pour une structure

4 réponses

dirthangel Messages postés 19 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 19 juin 2007
18 mai 2007 à 18:26
voic la structure C

struct sqlite3 {
  int nDb;                      /* Number of backends currently in use */
  Db *aDb;                      /* All backends */
  int flags;                    /* Miscellanous flags. See below */
  int errCode;                  /* Most recent error code (SQLITE_*) */
  int errMask;                  /* & result codes with this before returning */
  u8 autoCommit;                /* The auto-commit flag. */
  u8 temp_store;                /* 1: file 2: memory 0: default */
  int nTable;                   /* Number of tables in the database */
  CollSeq *pDfltColl;           /* The default collating sequence (BINARY) */
  i64 lastRowid;                /* ROWID of most recent insert (see above) */
  i64 priorNewRowid;            /* Last randomly generated ROWID */
  int magic;                    /* Magic number for detect library misuse */
  int nChange;                  /* Value returned by sqlite3_changes() */
  int nTotalChange;             /* Value returned by sqlite3_total_changes() */
  struct sqlite3InitInfo {      /* Information used during initialization */
    int iDb;                    /* When back is being initialized */
    int newTnum;                /* Rootpage of table being initialized */
    u8 busy;                    /* TRUE if currently initializing */
  } init;
  int nExtension;               /* Number of loaded extensions */
  void **aExtension;            /* Array of shared libraray handles */
  struct Vdbe *pVdbe;           /* List of active virtual machines */
  int activeVdbeCnt;            /* Number of vdbes currently executing */
  void (*xTrace)(void*,const char*);        /* Trace function */
  void *pTraceArg;                          /* Argument to the trace function */
  void (*xProfile)(void*,const char*,u64);  /* Profiling function */
  void *pProfileArg;                        /* Argument to profile function */
  void *pCommitArg;                 /* Argument to xCommitCallback() */  
  int (*xCommitCallback)(void*);    /* Invoked at every commit. */
  void *pRollbackArg;               /* Argument to xRollbackCallback() */  
  void (*xRollbackCallback)(void*); /* Invoked at every commit. */
  void *pUpdateArg;
  void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64);
  void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*);
  void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*);
  void *pCollNeededArg;
  sqlite3_value *pErr;          /* Most recent error message */
  char *zErrMsg;                /* Most recent error message (UTF-8 encoded) */
  char *zErrMsg16;              /* Most recent error message (UTF-16 encoded) */
  union {
    int isInterrupted;          /* True if sqlite3_interrupt has been called */
    double notUsed1;            /* Spacer */
  } u1;
#ifndef SQLITE_OMIT_AUTHORIZATION
  int (*xAuth)(void*,int,const char*,const char*,const char*,const char*);
                                /* Access authorization function */
  void *pAuthArg;               /* 1st argument to the access auth function */
#endif
#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
  int (*xProgress)(void *);     /* The progress callback */
  void *pProgressArg;           /* Argument to the progress callback */
  int nProgressOps;             /* Number of opcodes for progress callback */
#endif
#ifndef SQLITE_OMIT_VIRTUALTABLE
  Hash aModule;                 /* populated by sqlite3_create_module() */
  Table *pVTab;                 /* vtab with active Connect/Create method */
  sqlite3_vtab **aVTrans;       /* Virtual tables with open transactions */
  int nVTrans;                  /* Allocated size of aVTrans */
#endif
  Hash aFunc;                   /* All functions that can be in SQL exprs */
  Hash aCollSeq;                /* All collating sequences */
  BusyHandler busyHandler;      /* Busy callback */
  int busyTimeout;              /* Busy handler timeout, in msec */
  Db aDbStatic[2];              /* Static space for the 2 default backends */
#ifdef SQLITE_SSE
  sqlite3_stmt *pFetch;         /* Used by SSE to fetch stored statements */
#endif
  u8 dfltLockMode;              /* Default locking-mode for attached dbs */
};
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
19 mai 2007 à 00:32
Salut, pour utiliser une structure de C# vers du code C il faut la réécrire dans le code C#, en remplaçant chaque type par leur équivalent managé mais là ta structure est extremement compliquée, avec des pointeurs sur pointeur, des pointeurs de fonction, des directives de compilation et un tas de types prédéfinis propre à SQLite, bref faut être un expert de SQLite pour convertir cette structure.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
19 mai 2007 à 09:22
Ha ben vla que même Lutinore fait dans l'économie de CRLF

/*
coq
MVP Visual C#
CoqBlog
*/
0
tomlev Messages postés 25 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 28 août 2007
20 mai 2007 à 16:09
Salut,

Si tu veux mon avis, tu te compliques la vie pour rien... il existe des wrappers .NET beaucoup plus simple pour SQLite. Personnellement j'utilise celui ci :
http://sourceforge.net/projects/sqlite-dotnet2
En plus il respecte le modèle ADO.NET 2.0 !

Ah, SQLite... le meilleur SGBD du monde, Oracle fait pâle figure à côté ;-)

Tom
0
Rejoignez-nous