Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从大文件中检索版本信息_C#_.net - Fatal编程技术网

C# 从大文件中检索版本信息

C# 从大文件中检索版本信息,c#,.net,C#,.net,我们有大型可执行文件(>1,2GB),其中包含自定义版本信息。 我尝试使用“FileVersionInfo”类的“GetVersionInfo”从这些文件中检索此“版本信息”。 由于某些原因,此方法不会返回Windows XP中较大文件(测试时大于1 GB)的版本信息。对于一个大小为18MB的文件,它确实有效。 当我在Windows7(x86和X64)中尝试同样的方法时,它适用于所有文件,甚至更大的ONCE 我使用Reflector工具查看FileVersionInfo类,并创建了一个小型控制台

我们有大型可执行文件(>1,2GB),其中包含自定义版本信息。 我尝试使用“FileVersionInfo”类的“GetVersionInfo”从这些文件中检索此“版本信息”。 由于某些原因,此方法不会返回Windows XP中较大文件(测试时大于1 GB)的版本信息。对于一个大小为18MB的文件,它确实有效。 当我在Windows7(x86和X64)中尝试同样的方法时,它适用于所有文件,甚至更大的ONCE

我使用Reflector工具查看FileVersionInfo类,并创建了一个小型控制台应用程序来检索“文件版本信息”大小, 就像“GetVersionInfo”方法一样。在Windows XP中返回0(零)大小,在Windows 7中,相同文件返回1428大小。XP中的最后一个错误是1812(“指定的映像文件不包含资源节”)

这在Windows XP中不起作用,而在Windows 7中起作用的原因是什么? 是否有办法检索版本信息

下面是我测试过的代码:

class Program
{
    [DllImport("version.dll", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int GetFileVersionInfoSize(string lptstrFilename, out int handle);

    static void Main(string[] args)
    {
        Console.Write("Path which contains the executables: ");
        string path = Console.ReadLine();

        foreach (string fileName in Directory.EnumerateFiles(path))
        {
            int num;
            int fileVersionInfoSize = GetFileVersionInfoSize(fileName, out num);
            int error = Marshal.GetLastWin32Error();

            Console.WriteLine("File Version Info Size: " + fileVersionInfoSize);

            if (error != 0)
            {
                Console.WriteLine("Last Error: " + error);
            }
        }

        Console.ReadKey();
    }
}

加载程序可能无法将整个文件映射到其地址空间。请随意阅读PE文件格式以查找版本资源


然而,你用这么大的PE图像做什么?如果是自定义资源,最好将它们附加到.exe,这样加载程序只需映射一点,然后直接访问它们。这要求您知道自己的大小(在“此程序无法在MS-DOS模式下运行。”错误消息存根之后,偏移量124处有4个字节可以被安全覆盖)。

要确认,18mb的文件在XP上工作?是的,18mb的文件在XP上工作!