2014-06-19 5 views
2

Je souhaite que mon application C# exécute conditionnellement une méthode native, en choisissant conditionnellement d'exécuter la version x86 ou x64 de la DLL. Chaque fois que je tente de charger le fichier DLL 32 bits je reçois l'erreur suivante:Chargement d'une DLL 32 bits dans un processus 64 bits

Unhandled Exception: System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) 
    at <exeName>.MiniDumpMethods.MiniDumpWriteDumpX86(IntPtr hProcess, UInt32 processId, SafeHandle hFile, MINIDUMP_TYPE dumpType, IntPtr expParam, IntPtr userStreamParam, IntPtr callbackParam) 

contexte de fond: Je veux que mon binaire pour prendre une image mémoire d'un processus donné. Selon que le processus est en train de prendre un vidage mémoire de 32 ou 64 bits, il choisira d'exécuter la méthode MiniDumpwriteDump à partir de la version x86 ou x64 de dbghelp.dll.

Je suis actuellement faire ce qui suit:

[SuppressUnmanagedCodeSecurity] 
internal static class MiniDumpMethods 
{ 
    [DllImport("dbghelp.dll", 
     EntryPoint = "MiniDumpWriteDump", 
     CallingConvention = CallingConvention.StdCall, 
     CharSet = CharSet.Unicode, 
     ExactSpelling = true, 
     SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool MiniDumpWriteDump(
     IntPtr hProcess, 
     uint processId, 
     SafeHandle hFile, 
     MINIDUMP_TYPE dumpType, 
     IntPtr expParam, 
     IntPtr userStreamParam, 
     IntPtr callbackParam); 

[DllImport("dbghelpx86.dll", 
EntryPoint = "MiniDumpWriteDump", 
CallingConvention = CallingConvention.StdCall, 
CharSet = CharSet.Unicode, 
ExactSpelling = true, 
SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool MiniDumpWriteDumpX86(
     IntPtr hProcess, 
     uint processId, 
     SafeHandle hFile, 
     MINIDUMP_TYPE dumpType, 
     IntPtr expParam, 
     IntPtr userStreamParam, 
     IntPtr callbackParam); 
} 

Toute idée comment je peux charger conditionnellement soit x86 ou la version 64 bits de la dll?

(Note: dbghelpx86.dll est la version x86 de dbghelp.dll que je renomme)

Merci de

+0

Vous pouvez vérifier si IntPtr.Size est 4 ou 8 pour voir si le système d'exploitation hôte est 32 bits ou 64 bits –

+0

@MatiCicero Il ne s'agit pas du système d'exploitation hôte. La décision doit être prise par processus –

Répondre

2

Vous ne pouvez pas charger un DLL 32 bits dans un processus 64 bits. Pour supporter ceci, vous devrez avoir deux EXE différents, l'un compilé en 64 bits et l'autre compilé en 32 bits.

Si vous exécutez le processus 64 bits et rencontrez un vidage 32 bits, vous devrez lancer la version 32 bits du fichier EXE pour traiter le fichier de vidage. Une fois traité, vous pouvez utiliser un mécanisme IPC (Interprocess Communication) pour renvoyer les résultats au processus 64 bits.

Questions connexes