none
Obtenir la version d'une Dll utilisée par DllImport RRS feed

  • Question

  • Bonjour,

    Dans mon application j'utilise une méthode externe d'une Dll installée sur le système.

    Cette méthode utilise un paramètre de type flags dont certaine valeur de l'énumération ne sont pas supportées dans toutes les versions de cette Dll.

    Je souhaite obtenir la version de la Dll afin d'utiliser les flags supportés.

    Déclaration de la méthode externe :

    [DllImport("dbghelp.dll", EntryPoint = "MiniDumpWriteDump", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
    private static extern bool MiniDumpWriteDump(IntPtr hProcess, uint ProcessId, IntPtr hFile, MiniDumpType DumpType, IntPtr ExceptionParam, IntPtr UserStreamParam, IntPtr CallbackParam);

    Comment puis-je récupérer la version ou les informations (chemin) de la Dll utilisée lors de l'appel de cette méthode externe ? En utilisant Reflection ?

    Merci de votre aide,

    mardi 17 septembre 2013 16:07

Réponses

  • Bonjour,

    La solution proposée me retourne toujours le chemin de mon application, j'ai donc utilisé les méthodes LoadLibrary, GetModuleFileName, FreeLibrary pour récupérer le chemin et ensuite utilisé la classe FileVersionInfo pour récupérer la version.

    Si cette solution peut aider quelqu'un d'autre :

            [DllImport("kernel32.dll", SetLastError = true)]
            private static extern IntPtr LoadLibrary(string lpFileName);
    
            [DllImport("kernel32.dll", SetLastError = true)]
            [PreserveSig]
            private static extern uint GetModuleFileName([In] IntPtr hModule, [Out] StringBuilder lpFilename, [In][MarshalAs(UnmanagedType.U4)]int nSize);
    
            [DllImport("kernel32.dll", SetLastError = true)]
            private static extern bool FreeLibrary(IntPtr hModule);
    
            public static string GetDllPath(string _DllName)
            {
                IntPtr pDll = IntPtr.Zero;
                int lastWin32Error = 0;
                StringBuilder stringBuilder = new StringBuilder(short.MaxValue);
    
                try
                {
                    pDll = LoadLibrary(_DllName);
    
                    if (pDll == IntPtr.Zero)
                    {
                        lastWin32Error = Marshal.GetLastWin32Error();
    
                        if (lastWin32Error != 0)
                        {
                            throw new Win32Exception(lastWin32Error);
                        }
                    }
    
                    if (GetModuleFileName(pDll, stringBuilder, stringBuilder.Capacity) == 0)
                    {
                        lastWin32Error = Marshal.GetLastWin32Error();
    
                        if (lastWin32Error != 0)
                        {
                            throw new Win32Exception(lastWin32Error);
                        }
                    }
                }
                catch(Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (pDll != IntPtr.Zero)
                    {
                        if (!FreeLibrary(pDll))
                        {
                            lastWin32Error = Marshal.GetLastWin32Error();
    
                            if (lastWin32Error != 0)
                            {
                                throw new Win32Exception(lastWin32Error);
                            }
                        }
                    }
                }
    
                return stringBuilder.ToString();
            }
    
            public static string GetDllVersion(string _DllName)
            {
                string dllVersion = string.Empty;
                string fileName = string.Empty;
                FileVersionInfo fileVersionInfo = null;
    
                try
                {
                    if (File.Exists(_DllName))
                    {
                        fileName = _DllName;
                    }
                    else
                    {
                        fileName = GetDllPath(_DllName);
                    }
    
                    if (fileName != string.Empty)
                    {
                        fileVersionInfo = FileVersionInfo.GetVersionInfo(fileName);
    
                        if (fileVersionInfo != null)
                        {
                            dllVersion = fileVersionInfo.ProductVersion;
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
    
                return dllVersion;
            }

    Cordialement,

    • Marqué comme réponse Atmeitsatme jeudi 19 septembre 2013 16:03
    jeudi 19 septembre 2013 16:02

Toutes les réponses

  • Bonjour,

    Pour obtenir la version d'une DLL native (non .NET) :

    FileVersionInfo versionInfo;
    versionInfo = FileVersionInfo.GetVersionInfo("Emplacement de votre dbghelp.dll");
    
    Console.WriteLine("La version de dbghelp.dll : " + versionInfo.FileVersion);

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mardi 17 septembre 2013 22:22
    Modérateur
  • Bonjour,

    Effectivement cette méthode permet d'obtenir la version de la dll, cependant elle nécessite de connaitre la localisation de celle-ci. Dans mon exemple j'utilise la dll "dbghelp.dll" sans savoir où elle se situe.

    Comment retrouver le fichier correspondant à la dll utilisée par DllImport ?

    Cordialement,

    mercredi 18 septembre 2013 06:37
  • Bonjour

    Pour récupérer le chemin vers le fichier, veuillez regarder la solution proposée ici.

    Cordialement,



    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.


    • Modifié Aurel Bera mercredi 18 septembre 2013 09:05
    mercredi 18 septembre 2013 08:53
  • Bonjour,

    La solution proposée me retourne toujours le chemin de mon application, j'ai donc utilisé les méthodes LoadLibrary, GetModuleFileName, FreeLibrary pour récupérer le chemin et ensuite utilisé la classe FileVersionInfo pour récupérer la version.

    Si cette solution peut aider quelqu'un d'autre :

            [DllImport("kernel32.dll", SetLastError = true)]
            private static extern IntPtr LoadLibrary(string lpFileName);
    
            [DllImport("kernel32.dll", SetLastError = true)]
            [PreserveSig]
            private static extern uint GetModuleFileName([In] IntPtr hModule, [Out] StringBuilder lpFilename, [In][MarshalAs(UnmanagedType.U4)]int nSize);
    
            [DllImport("kernel32.dll", SetLastError = true)]
            private static extern bool FreeLibrary(IntPtr hModule);
    
            public static string GetDllPath(string _DllName)
            {
                IntPtr pDll = IntPtr.Zero;
                int lastWin32Error = 0;
                StringBuilder stringBuilder = new StringBuilder(short.MaxValue);
    
                try
                {
                    pDll = LoadLibrary(_DllName);
    
                    if (pDll == IntPtr.Zero)
                    {
                        lastWin32Error = Marshal.GetLastWin32Error();
    
                        if (lastWin32Error != 0)
                        {
                            throw new Win32Exception(lastWin32Error);
                        }
                    }
    
                    if (GetModuleFileName(pDll, stringBuilder, stringBuilder.Capacity) == 0)
                    {
                        lastWin32Error = Marshal.GetLastWin32Error();
    
                        if (lastWin32Error != 0)
                        {
                            throw new Win32Exception(lastWin32Error);
                        }
                    }
                }
                catch(Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (pDll != IntPtr.Zero)
                    {
                        if (!FreeLibrary(pDll))
                        {
                            lastWin32Error = Marshal.GetLastWin32Error();
    
                            if (lastWin32Error != 0)
                            {
                                throw new Win32Exception(lastWin32Error);
                            }
                        }
                    }
                }
    
                return stringBuilder.ToString();
            }
    
            public static string GetDllVersion(string _DllName)
            {
                string dllVersion = string.Empty;
                string fileName = string.Empty;
                FileVersionInfo fileVersionInfo = null;
    
                try
                {
                    if (File.Exists(_DllName))
                    {
                        fileName = _DllName;
                    }
                    else
                    {
                        fileName = GetDllPath(_DllName);
                    }
    
                    if (fileName != string.Empty)
                    {
                        fileVersionInfo = FileVersionInfo.GetVersionInfo(fileName);
    
                        if (fileVersionInfo != null)
                        {
                            dllVersion = fileVersionInfo.ProductVersion;
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
    
                return dllVersion;
            }

    Cordialement,

    • Marqué comme réponse Atmeitsatme jeudi 19 septembre 2013 16:03
    jeudi 19 septembre 2013 16:02