CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C/C#] Wrapper

Aldebran
Aldebran
Niveau 10
12 octobre 2011 à 11:15:34

Salut tout le monde, en ce moment je dois réaliser un wrapper qui me permette d'appeler en C# les fonctions d'une bibliothèque C qui doit me permettre d'obtenir des informations à partir d'un capteur. Pour cela j'utilise P/Invoke du package System.Runtime.InteropServices.

Le prototype de ma fonction C est le suivant :
void disableDevice(unsigned int deviceHandler);

Et évidemment je n'ai pas accès au code source de cette fonction.

Pour utiliser cette fonction en C#, voilà ce que je déclare :
[DllImport("device.dll")]
private static extern void disableDevice(int deviceHandler);

public void Disable() {
disableDevice(this.m_handler);
}

Cela a marché jusqu'à présent pour toutes les fonctions que j'ai eu à appeler en C#, mais ça ne marche pas pour la fonction qui se charge de désactiver le périphérique. Lorsque la méthode Disable() de la classe Device() est appelée, j'obtiens une AccessViolationException qui m'indique que j'ai tenté de modifier un endroit protégé de la mémoire.

Et sincèrement je ne sais pas du tout pourquoi il me lance cette exception, d'autant plus que la doc de la DLL ne parle pas d'éventuels effets de bords de la fonction disableDevice(). Existerait-il un moyen de "déprotéger" la mémoire et qui me permettrait de virer cette AccessViolationException ?

Paulop
Paulop
Niveau 12
12 octobre 2011 à 12:45:05

Je ne garantie rien du tout, mais essaye comme ça :

[DllImport("device.dll"), SuppressUnmanagedCodeSecurity]

Aldebran
Aldebran
Niveau 10
12 octobre 2011 à 13:37:18

Malheureusement ça ne marche pas :-(

Aldebran
Aldebran
Niveau 10
16 octobre 2011 à 16:24:34

Finalement j'ai à moitié trouvé pourquoi ça faisait ça : avant j'avais cette exception lorsque j'appelais la méthode Disable() dans le destructeur de ma classe Device, maintenant j'ai supprimé le destructeur, j'appelle manuellement la méthode Disable() et je n'ai plus ce problème. Par contre je sais d'où provient l'exception, mais je ne sais toujours pas pourquoi :(
Et c'est plutôt embêtant car en n'utilisant plus le destructeur j'ai réussi à réduire pas mal le nombre d'AccessViolationException mais il m'en reste quand même quelques unes.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment