Interop DLL en C utilisée en C#
Bonjour à tous,
J'ai un problème dans l'utilisation d'une classe contenu dans une DLL C dans un problème C#. J'ai donc essayé de définir des fonctions mais j'ai les mêmes problèmes
Pour information je peux modifier la DLL C et bien évidemment le programme C#.
Voici la partie déclarative en C :
Code:
1 2 3
| extern "C" __declspec(dllexport) CglassDetection* CglassDetection_New(wchar_t* _imageName);
extern "C" __declspec(dllexport) wchar_t* CglassDetection_GetForme(CglassDetection* cp);
extern "C" __declspec(dllexport) void CglassDetection_Delete(CglassDetection* cp); |
Partie classe en C :
Code:
wchar_t* TraiterImage();
Voici la partie déclarative en C# :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| [DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "CglassDetection_New", CharSet = CharSet.Unicode)]
public static extern IntPtr NewCglassDetection(String imageName);
[DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "CglassDetection_Delete", CharSet = CharSet.Unicode)]
public static extern void DeleteCglassDetection(IntPtr cp);
[DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "CglassDetection_GetForme", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string GetForme(IntPtr thisptr);
[DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "?TraiterImage@CglassDetection@@QAEPA_WXZ",
CharSet = CharSet.Auto, CallingConvention = CallingConvention.ThisCall)]
//[return: MarshalAs(UnmanagedType.LPStr)]
public static extern IntPtr TraiterImage(IntPtr thisptr); |
Voilà le main en C# :
Code:
1 2 3 4
| IntPtr cg = NewCglassDetection("S:\\Exemples\\Formes\\Shape_7.jpg");
//string myForme = TraiterImage(cg);
string myForme = GetForme(cg);
DeleteCglassDetection(cg); |
Mon problème :
Si ma fontion GetForme créé un fichier contenant la string cela fonctionne par contre dès que je veux que ma fonction renvoi la string (Wchar_t en C) alors là j'ai l'erreur suivante :
Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
Je ne comprend vraiment pas dès que ma fonction retourne une valeur alors ça plante.
Je dois manquer quelquechose, en cherchant j'ai vu qu'il fallait ajouter :
[return: MarshalAs(UnmanagedType.LPStr)]
à ma définition mais cela ne fonctionne pas non plus.
Si quelqu'un à l'expérience pour m'aider merci d'avance car là je commence à devenir fou ... :aie:
CobNemos