l’application se ferme (pas d’exception) lors de la référence à une dll 64 bits à partir de C #

J’ai compilé lzo2.dll 64 bits et cherche maintenant à l’utiliser dans un programme C #:

J’utilise la classe suivante pour tester (un code similaire fonctionne pour lzo.dll à 32 bits):

[DllImport("lzo2.dll")] private static extern ssortingng lzo_version_ssortingng(); static void Main(ssortingng[] args) { try { if (Environment.Is64BitProcess) { Console.WriteLine(lzo_version_ssortingng());//application exits here, no exceptions caught } } catch (Exception e) { Console.WriteLine(e); } Console.ReadLine(); } 

Au point indiqué, l’application se bloque, j’ai donc sorti windbg et en voici le résultat: (désolé pour la verbosité)

 0:000> !analyze -v ******************************************************************************* * * * Exception Analysis * * * ******************************************************************************* *** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlib\e0e5fbe72e8813a135fc878ff32b4bee\mscorlib.ni.dll *** WARNING: Unable to verify checksum for Lzo64.exe GetPageUrlData failed, server returned HTTP status 404 URL requested: http://watson.microsoft.com/StageOne/Lzo64_exe/1_0_0_0/4eccdc93/ntdll_dll/6_1_7601_17514/4ce7c8f9/80000003/000c40bf.htm?Resortingage=1 FAULTING_IP: ntdll!RtlReportCriticalFailure+2f 00000000`77a240bf cc int 3 EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 0000000077a240bf (ntdll!RtlReportCriticalFailure+0x000000000000002f) ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 1 Parameter[0]: 0000000000000000 FAULTING_THREAD: 0000000000001c90 PROCESS_NAME: Lzo64.exe ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached. EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid EXCEPTION_PARAMETER1: 0000000000000000 MOD_LIST:  NTGLOBALFLAG: 70 APPLICATION_VERIFIER_FLAGS: 0 MANAGED_STACK: (TransitionMU) 000000000054E670 000007FEF1F3BF6C mscorlib_ni!System.StubHelpers.CSTRMarshaler.ClearNative(IntPtr)+0x3c 000000000054E730 000007FF00140319 Lzo64!DomainBoundILStubClass.IL_STUB_PInvoke()+0x14031a 000000000054E840 000007FF00140181 Lzo64!Lzo64.Program.Main(System.Ssortingng[])+0x61 (TransitionUM) MANAGED_STACK_COMMAND: _EFN_StackTrace LAST_CONTROL_TRANSFER: from 0000000077a24736 to 0000000077a240bf BUGCHECK_STR: APPLICATION_FAULT_WRONG_SYMBOLS_CALL PRIMARY_PROBLEM_CLASS: WRONG_SYMBOLS_CALL DEFAULT_BUCKET_ID: WRONG_SYMBOLS_CALL STACK_TEXT: 00000000`0054e3d0 00000000`77a24736 : 00000000`00000002 00000000`00000023 00000000`0054e6a8 00000000`00000003 : ntdll!RtlReportCriticalFailure+0x2f 00000000`0054e4a0 00000000`77a25942 : 000007fe`f1533de8 000007fe`f1533de8 00000000`0054ea10 00000000`0054e8a8 : ntdll!RtlpReportHeapFailure+0x26 00000000`0054e4d0 00000000`77a275f4 : 00000000`005d0000 00000000`00000000 00000000`00000000 00000000`0064e560 : ntdll!RtlpHeapHandleError+0x12 00000000`0054e500 00000000`779cdcb7 : 000007fe`faab7b68 00000000`005d0000 000007fe`faab7b68 000007fe`f2d85000 : ntdll!RtlpLogHeapFailure+0xa4 00000000`0054e530 000007fe`fe3e8e56 : 00000000`0054e900 000007fe`faab7b68 00000000`f2734dd5 00000000`00000000 : ntdll! ?? ::FNODOBFM::`ssortingng'+0x10c7c 00000000`0054e5b0 000007fe`f27319c2 : 000007fe`faab7b68 0000a965`d9ebab11 000007fe`faab7b68 00000000`00000004 : ole32!CoTaskMemFree+0x36 00000000`0054e5e0 000007fe`f1f3bf6c : 000007fe`faab7b68 00000000`0054ea10 0000a965`d9ebab11 000007fe`f2dbd2c0 : clr!DoNDirectCallWorker+0x62 00000000`0054e670 000007ff`00140319 : 00000000`00000000 000007ff`000240f0 00000000`0054ea10 00000000`0054e8a8 : mscorlib_ni+0xa8bf6c 00000000`0054e730 000007ff`00140181 : 00000000`00000001 00000000`0054eaa0 00000000`0054e900 000007fe`f2734dd5 : 0x7ff`00140319 00000000`0054e840 000007fe`f2759714 : 00000000`02c31a58 00000000`0054eaa0 00000000`0054e900 000007fe`f2734dd5 : 0x7ff`00140181 00000000`0054e8a0 000007fe`f2759829 : 000007ff`00024138 00000000`00000001 00000000`00000000 00000000`00000000 : clr!CallDescrWorker+0x84 00000000`0054e8f0 000007fe`f27598a5 : 00000000`0054ea08 00000000`00000001 00000000`0054ea10 00000000`0054ebf0 : clr!CallDescrWorkerWithHandler+0xa9 00000000`0054e970 000007fe`f28f6651 : 00000000`00000000 00000000`0054ebf8 00000000`00000001 000007fe`f14b1a32 : clr!MethodDesc::CallDescr+0x2a1 00000000`0054eba0 000007fe`f28f6788 : 00000000`0064e560 00000000`0064e560 00000000`00000000 00000000`00000000 : clr!ClassLoader::RunMain+0x228 00000000`0054edf0 000007fe`f28f653e : 00000000`0054f3f0 00000000`00000200 00000000`0065afa0 00000000`00000200 : clr!Assembly::ExecuteMainMethod+0xac 00000000`0054f0a0 000007fe`f2915e56 : 00000000`00000000 00000000`01280000 00000000`00000000 00000000`00000000 : clr!SystemDomain::ExecuteMainMethod+0x452 00000000`0054f650 000007fe`f2915d73 : 00000000`01280000 00000000`00000000 00000000`00000000 00000000`00000000 : clr!ExecuteEXE+0x43 00000000`0054f6b0 000007fe`f2906c6d : 00000000`0064e560 ffffffff`ffffffff 00000000`00000000 00000000`00000000 : clr!CorExeMainInternal+0xc4 00000000`0054f720 000007fe`f9d03309 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`0054f708 : clr!CorExeMain+0x15 00000000`0054f760 000007fe`f9e15b21 : 000007fe`f2906c58 000007fe`f9d032c0 00000000`00000000 00000000`00000000 : mscoreei!CorExeMain+0x41 00000000`0054f790 00000000`773f652d : 000007fe`f9d00000 00000000`00000000 00000000`00000000 00000000`00000000 : MSCOREE!CorExeMain_Exported+0x57 00000000`0054f7c0 00000000`7798c521 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0xd 00000000`0054f7f0 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d STACK_COMMAND: .cxr 0000000000000000 ; kb ; dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ~0s ; kb FOLLOWUP_IP: clr!DoNDirectCallWorker+62 000007fe`f27319c2 41c744240c01000000 mov dword ptr [r12+0Ch],1 SYMBOL_STACK_INDEX: 6 SYMBOL_NAME: clr!DoNDirectCallWorker+62 FOLLOWUP_NAME: MachineOwner MODULE_NAME: clr IMAGE_NAME: clr.dll DEBUG_FLR_IMAGE_TIMESTAMP: 4e1822f4 FAILURE_BUCKET_ID: WRONG_SYMBOLS_CALL_80000003_clr.dll!DoNDirectCallWorker BUCKET_ID: X64_APPLICATION_FAULT_WRONG_SYMBOLS_CALL_clr!DoNDirectCallWorker+62 WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/Lzo64_exe/1_0_0_0/4eccdc93/ntdll_dll/6_1_7601_17514/4ce7c8f9/80000003/000c40bf.htm?Resortingage=1 Followup: MachineOwner --------- 

J’ai jeté un coup d’œil à cela, mais je ne peux toujours pas identifier le moindre problème. Je crois que sa plainte au sujet des symboles même si la trace de stack semble avoir des noms et ainsi donner une certaine signification. Quelqu’un peut-il suggérer quel pourrait être le problème ou indiquer la direction à suivre?

Il s’ouvre correctement dans CFF Explorer et Dependency Walker.

Il ne semble pas y avoir de problème avec le fichier lzo2.dll en lui-même, car les applications de test fournies dans le cadre du processus de construction (lzotest.exe -mlzo COPYING) ont réussi.

Aucune trace de stack mais je peux deviner, vous voyez quelque part CoTaskMemFree (). C’est ce que l’appel de marshaller, pinvoke, appelle pour libérer le tampon de chaîne renvoyé par la fonction. Le problème est que ce tampon de chaîne n’a pas été alloué par CoTaskMemAlloc (). Vista et Windows 7 ont un gestionnaire de mémoire beaucoup plus ssortingct, ils ne permettent pas à un programme de libérer de la mémoire qu’il n’a pas allouée. Cela fonctionne sur XP, il ignore simplement le pointeur de tampon défectueux.

Les fonctions C qui renvoient des chaînes posent un problème de gestion de la mémoire. Il est toutefois probable que cela fonctionne dans ce cas particulier, il retourne probablement un littéral de chaîne qui n’a pas besoin d’être publié. Vous devez arrêter le marshaller d’essayer de libérer la chaîne, déclarez la fonction comme ceci:

 [DllImport("lzo2.dll")] private static extern IntPtr lzo_version_ssortingng(); 

et l’utiliser comme ça:

 IntPtr strPtr = lzo_version_ssortingng(); ssortingng version = Marshal.PtrToSsortingngAnsi(strPtr);