// printversion.cs
// 编译时使用:/unsafe
using System;
using System.Reflection;
using System.Runtime.InteropServices;
// 为此程序集指定一个版本号:
[assembly:AssemblyVersion("4.3.2.1")]
public class Win32Imports
{
[DllImport("version.dll")]
public static extern bool GetFileVersionInfo (string sFileName,
int handle, int size, byte[] infoBuffer);
[DllImport("version.dll")]
public static extern int GetFileVersionInfoSize (string sFileName,
out int handle);
// 自动将第三个参数“out string pValue”从 Ansi
// 封送处理为 Unicode:
[DllImport("version.dll")]
unsafe public static extern bool VerQueryValue (byte[] pBlock,
string pSubBlock, out string pValue, out uint len);
// 此 VerQueryValue 重载被标记为“unsafe”,因为
// 它使用 short*:
[DllImport("version.dll")]
unsafe public static extern bool VerQueryValue (byte[] pBlock,
string pSubBlock, out short *pValue, out uint len);
}
public class C
{
// Main 被标记为“unsafe”,因为它使用指针:
unsafe public static int Main ()
{
try
{
int handle = 0;
// 确定有多少版本信息:
int size =
Win32Imports.GetFileVersionInfoSize("printversion.exe",
out handle);
if (size == 0) return -1;
byte[] buffer
= new byte[size
];
if (!Win32Imports.GetFileVersionInfo("printversion.exe", handle, size, buffer))
{
Console.WriteLine("Failed to query file version information.");
return 1;
}
short *subBlock = null;
uint len = 0;
// 从版本信息获取区域设置信息:
if (!Win32Imports.VerQueryValue (buffer, @"\VarFileInfo\Translation", out subBlock, out len))
{
Console.WriteLine("Failed to query version information.");
return 1;
}
string spv = @"\StringFileInfo\" + subBlock[0].ToString("X4") + subBlock[1].ToString("X4") + @"\ProductVersion";
byte *pVersion = null;
// 获取此程序的 ProductVersion 值:
string versionInfo;
if (!Win32Imports.VerQueryValue (buffer, spv, out versionInfo, out len))
{
Console.WriteLine("Failed to query version information.");
return 1;
}
Console.WriteLine ("ProductVersion == {0}", versionInfo);
}
catch (Exception e)
{
Console.WriteLine ("Caught unexpected exception " + e.Message);
}
return 0;
}
}
//csharp/4927