2009-08-07 2 views
2

Unten ist das Codebeispiel, das ich von Online-Ressource erhalten habe, aber es wird mit Fullframework arbeiten, aber wenn ich versuche, es mit C# Smart-Gerät zu bauen, löst es eine Ausnahme aus, es ist nicht genügend Arbeitsspeicher. Weiß jemand wie kann ich es reparieren, um auf kompaktem zu verwenden? die Out-of-Memory-Ausnahme, wenn ich den zweiten Aufruf von VerQueryValue mache, der der letzte ist.C# PInvoke VerQueryValue gibt OutOfMemoryException zurück?

Dank,

[DllImport("coredll.dll")] 
    public static extern bool VerQueryValue(byte[] buffer, string subblock, out IntPtr blockbuffer, out uint len); 

    [DllImport("coredll.dll")] 
    public static extern bool VerQueryValue(byte[] pBlock, string pSubBlock, out string pValue, out uint len);  
    // 
    private static void GetAssemblyVersion() 
    { 

     string filename = @"\Windows\MyLibrary.dll"; 
     if (File.Exists(filename)) 
     { 
      try    { 

       int handle = 0; 
       Int32 size = 0; 
       size = GetFileVersionInfoSize(filename, out handle); 

       if (size > 0) 
       { 
        bool retValue; 
        byte[] buffer = new byte[size]; 
        retValue = GetFileVersionInfo(filename, handle, size, buffer); 
        if (retValue == true) 
        { 
         bool success = false; 
         IntPtr blockbuffer = IntPtr.Zero; 
         uint len = 0; 
         //success = VerQueryValue(buffer, "\\", out blockbuffer, out len); 
         success = VerQueryValue(buffer, @"\VarFileInfo\Translation", out blockbuffer, out len); 

         if(success) 
         { 
          int p = (int)blockbuffer; 

          //Reads a 16-bit signed integer from unmanaged memory 
          int j = Marshal.ReadInt16((IntPtr)p); 
          p += 2; 

          //Reads a 16-bit signed integer from unmanaged memory 
          int k = Marshal.ReadInt16((IntPtr)p); 

          string sb = string.Format("{0:X4}{1:X4}", j, k); 
          string spv = @"\StringFileInfo\" + sb + @"\ProductVersion"; 

          string versionInfo; 
          VerQueryValue(buffer, spv, out versionInfo, out len); 
         }  
        } 
       } 
      } 
      catch (Exception err) 
      { 
       string error = err.Message; 
      } 
     } 
    } 

Antwort

0

Nachdem diese beiden Aussagen ergänzt:

      Int32 dwVerMinor = j & 0xffff; 
          Int32 dwVerBuild = k & 0xffff; 

es in der Lage die DLL-Version abrufen.