作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的实用程序,它使用一些不安全的代码来获取文件版本信息。当我将其编译为混合平台 (vs2008/.net 3.5) 并部署到 64 位机器时,出现堆损坏错误。如果我重新编译为 x86,那么一切正常....
由于我对 .NET 通用类型系统的理解,这让我感到惊讶。我的不安全代码使用一个指向 short 的指针和一个指向字节的指针。由于 CTS,这些常见类型在任何平台上的大小是否相同?我在这里错过了什么
using System;
using System.Reflection;
using System.Runtime.InteropServices;
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);
// The third parameter - "out string pValue" - is automatically
// marshaled from ANSI to Unicode:
[DllImport("version.dll")]
unsafe public static extern bool VerQueryValue(byte[] pBlock,
string pSubBlock, out string pValue, out uint len);
// This VerQueryValue overload is marked with 'unsafe' because
// it uses a short*:
[DllImport("version.dll")]
unsafe public static extern bool VerQueryValue(byte[] pBlock,
string pSubBlock, out short* pValue, out uint len);
}
public class FileInformation
{
// Main is marked with 'unsafe' because it uses pointers:
unsafe public static string GetVersionInformation(string path)
{
// Figure out how much version info there is:
int handle = 0;
int size =
Win32Imports.GetFileVersionInfoSize(path,
out handle);
if (size == 0) return "";
byte[] buffer = new byte[size];
if (!Win32Imports.GetFileVersionInfo(path, handle, size, buffer)) return "";
// Get the locale info from the version info:
short* subBlock = null;
uint len = 0;
if (!Win32Imports.VerQueryValue(buffer, @"\VarFileInfo\Translation", out subBlock, out len)) return "";
// Get the ProductVersion value for this program:
string spv = @"\StringFileInfo\" + subBlock[0].ToString("X4") + subBlock[1].ToString("X4") + @"\ProductVersion";
byte* pVersion = null;
string versionInfo;
if (!Win32Imports.VerQueryValue(buffer, spv, out versionInfo, out len)) return "";
return versionInfo;
}
}
谢谢所有僵尸的 killer 和等待僵尸启示录......-乔纳森
最佳答案
您有什么理由不能使用 FileVersionInfo 为此管理 类?我怀疑它在 32 位和 64 位平台上都能正常工作。
关于c# - 除非为 x86 平台构建,否则不安全的 c# 代码会导致 64 位平台上的堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3459510/
我正在开发一个在 VS 社区 2017 中开发并使用 IIS Express 10 的 .net Core MVVC 项目,我遇到了 TempData 无法在我开发的 3 台计算机中的两台上运行的问题
我是一名优秀的程序员,十分优秀!