Bonjour à tous,

On peut penser que je me suis trompée de catégorie pour poster mon problème vu le titre... Mais en fait pas tant que ça : j'exécute du code Java depuis mon application C#. Je me suis en fait servie de IKVM pour créer une dll compréhensible par le C#. Cela fonctionne bien sauf pour un seul cas : la lecture de carte d'identité.

En effet, j'utilise javax.smartcardio afin de lire la carte d'identité insérée dans le PC et cela ne fonctionne pas : TerminalFactory semble ne pas pouvoir instancier la classe permettant de signaler l'existence d'un lecteur de cartes...

Pour ceux qui ne le connaissent pas, un petit mot sur ce que j'ai appris sur javax.smartcardio.TerminalFactory: Cette classe va lire la propriété système javax.smartcardio.TerminalFactory.DefaultType. Cette propriété peut être soit "PC/SC", soit "None". TerminalFactory va, dans le cas où cette propriété a été définie, tenter d'instancier la classe correspondante. Dans le cas de PC/SC, on va instancier le provider SunPCSC. S'il arrive quoique ce soit comme problème empêchant l'instanciation de l'objet, la propriété sera mise à "None"

Dans mon cas, il semblerait que la propriété soit définie à "PC/SC" comme je le souhaite, mais une erreur se déclenche lors de l'instanciation de SunPCSC et il passe donc à None, ne pouvant donc détecter les lecteurs...

Voici la stacktrace reçue :

java.security.NoSuchAlgorithmException : Error constructing implementation (algorithm: PC/SC, provider: SunPCSC, class: sun.security.smartcardio.SunPCSC$Factory)
----> java.lang.UnsupportedOperationException : PC/SC not available on this platform
----> java.lang.UnsatisfiedLinkError : no j2pcsc in java.library.path
at java.security.Provider.Service.newInstance(Object constructorParameter)
at sun.security.jca.GetInstance.getInstance(Service s, Class clazz, Object param)
at sun.security.jca.GetInstance.getInstance(String type, Class clazz, String algorithm, Object param, Provider provider)
at javax.smartcardio.TerminalFactory.getInstance(String type, Object params, Provider provider)
--UnsupportedOperationException
at sun.security.smartcardio.PCSC.checkAvailable()
at sun.security.smartcardio.SunPCSC.Factory..ctor(Object obj)
at __<Invoker>(Object[] )
--UnsatisfiedLinkError
at java.lang.ClassLoader.loadLibrary(Class , String , Boolean )
at java.lang.Runtime.loadLibrary0(Class , String )
at java.lang.System.loadLibrary(String libname, CallerID )
at sun.security.action.LoadLibraryAction.run()
at sun.security.action.LoadLibraryAction.<bridge>run()
at sun.security.action.LoadLibraryAction.java.security.PrivilegedAction/()Ljava.lang.Object;run()
at java.security.AccessController.doPrivileged(Object , AccessControlContext , CallerID )
at java.security.AccessController.doPrivileged(PrivilegedAction action, CallerID )
at sun.security.smartcardio.PlatformPCSC.loadLibrary()


Je comprends là que la librairie j2pcsc dont a surement besoin SunPCSC n'a pas pu être trouvée. J'ai donc ajouté la librairie à mon projet C# (référence + ajout dans le répertoire Debug) et, pour être bien sûre, j'ai ajouté cette ligne de code avant de faire quoique ce soit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
java.lang.System.loadLibrary("j2pcsc");
Etant donné qu'il semble que ce soit cette méthode qui déclenche l'exception, je me suis dit qu'elle devrait également lancer une exception ? Mais non, ce loadLibrary fonctionne à merveille et TerminalFactory me renvoie pourtant toujours le même soucis !