Bonjour à tous,
ça fait deux ans que je viens lire vos post et vous m'êtes à chaque fois d'une grande utilité mais pour la première fois, je ne trouve pas de réponse à mon problème et je sollicite votre aide...
J'espère déjà avoir posté au bon endroit...
Voilà mon problème j'ai une dll qui a été écrite en c++ et qui fonctionne très bien dans un programme écrit en c++...
voici le code de mon programme c++
Dans le .h:
Dans le .cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #if defined(_VB_) #define FCT_PREFIX __stdcall #define TOTO_API #elif defined(_WIN32) || defined (__WIN32__) || defined (_WIN32_WCE) #ifdef TOTO_EXPORTS #define TOTO_API __declspec(dllexport) #define FCT_PREFIX #else #define TOTO_API __declspec(dllimport) #define FCT_PREFIX #endif #elif defined (__BORLANDC__) && defined (_WIN32) #define TOTO_API __cdecl #define FCT_PREFIX #else #define FCT_PREFIX #define TOTO_API #endif #define TOTO_Init(iReaderType, iCardSlot, pszReaderName) TOTO_InitEx(iElem1, iElem2, pszElem3, iElem4, iElem5) TOTO_API TOTO_Status FCT_PREFIX TOTO_InitEx(int iElem1, int iElem2, char *pszElem3, long lElem4, long lElem5); TOTO_API TOTO_Status FCT_PREFIX TOTO_Exit(); typedef struct { long general ; /* General return code */ long system ; /* System error */ BYTE cardSW [2] ; char ErrorMsg [64] ; /* Eror Message */ char rfu [14] ; } TOTO_Status;
Et là tout fonctionne nickel...TOTO_Init(TOTO_I, 0, NULL);
//mon code...
TOTO_Exit();
Mais quand il est question de l'utiliser en C# c'est un tout autre problème...
mon code en C#
Ma region DLLImport:
[DllImport("TOTO_SDK.dll", EntryPoint = "MOB_InitEx")]
public static extern TOTO_Status TOTO_InitEx(int iElem1, int iElem2, string pszElem3, int iElem4, int iElem5);
[DllImport("TOTO_SDK.dll", EntryPoint = "TOTO_Exit")]
public static extern TOTO_Status TOTO_Exit();
Ma définition de TOTO_Status
Et mon appel:[StructLayout(LayoutKind.Sequential)]
public class TOTO_Status
{
public long general ; /* General return code */
public long system ; /* System error */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public Byte[] cardSW ;// = new Byte [2];
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string ErrorMsg; /* Eror Message */
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string rfu;
}
Et quand j'exécute...TOTO_Status = TOTO_InitEx(iElem1, 0, null, iElem4, iElem5);
TOTO_Status =TOTO_Exit();
j'ai ce message d'erreur :
L'exception NotSupportedException n'a pas été gérée, et je vais au lieu qu'il m'indique...
alors j'ai ces infos...
et encoreAssurez-vous que la méthode est prise en charge.
Il y a des méthodes qui ne sont pas prises en charge dans la classe de base et dont il est attendu qu'elles soient plutôt implémentées dans les classes dérivées. Si une classe dérivée implémente uniquement un sous-ensemble des méthodes de sa classe de base, elle lève une exception NotSupportedException pour les méthodes non prises en charge.
mais je pense avoir fait le nécessaire... ça fait deux jours que je bloque là-dessus...Lorsque vous utilisez le .NET Compact Framework et P/Invoke sur une fonction native, cette exception peut être levée dans les cas suivants :
la déclaration dans le code managé est incorrecte ;
le .NET Compact Framework ne prend pas en charge l'opération que vous tentez d'effectuer ;
les noms de DLL sont tronqués lors de l'exportation.
Dans ce cas :
Recherchez toutes violations des restrictions P/Invoke du .NET Compact Framework.
Recherchez tous les argument qui requièrent de la mémoire pré-allouée. Si vous en trouvez, vous devez passer une référence à une variable existante.
Vérifiez que les noms des fonctions exportées sont corrects. Cette vérification peut être réalisée à l'aide de DumpBin.exe.
Vérifiez que vous n'essayez pas de passer un trop grand nombre d'arguments.
Je ne sais plus du tout quoi faire...
J'en rêve de la nuit même... je parie que mon erreur est idiote mais je suis tellement naze que je vois pas... je suis coincée par des délais de temps très strict... et c'est pour ça que je vous demande votre aide...
Si vous pouviez m'aider ce serait vraiment gentil...
Merci à tous d'avance d'avoir lu mon message...
Partager