C# interop dll C, comment charger une structure

Signaler
Messages postés
19
Date d'inscription
lundi 5 mai 2003
Statut
Membre
Dernière intervention
19 juin 2007
-
Messages postés
25
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
28 août 2007
-
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

Messages postés
19
Date d'inscription
lundi 5 mai 2003
Statut
Membre
Dernière intervention
19 juin 2007

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 */
};
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
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.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Ha ben vla que même Lutinore fait dans l'économie de CRLF

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
25
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
28 août 2007

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