【问题标题】:CPUID support in C#C# 中的 CPUID 支持
【发布时间】:2012-03-21 13:13:05
【问题描述】:

上周我一直在用头撞砖墙。那堵墙:CPUID。

我偶然发现的所有内容都说要在 C++ 中构建一个实现 CPUID 的类库,然后在 C# 项目中使用它。

由于各种原因,我一直无法让 C++ 类库在我的 C# 项目中正常工作,我正要放弃并告诉客户他们的请求不能履行。但是,我已经走投无路了,想寻求帮助。

有没有ANY 方法可以让 __cpuid() 或 asm 在 C# 中编译而无需构建外部程序集?

【问题讨论】:

  • Hrm,我刚刚发现x86/x64 CPUID in C# 可能有用。不过,我对 cme​​ts 和其他想法持开放态度。

标签: c# visual-studio-2008 cpuid


【解决方案1】:

需要非 C# 程序集,因为 C# 编译器生成纯 MSIL,并且没有针对 CPUID 的 MSIL 指令。您链接的问题包括作为数据的 CPUID,而不是代码,它非常脆弱,您必须在 .NET 外部调用 Win32 API 来标记数据可执行文件,这似乎与您对“无外部程序集”的愿望相矛盾。

但是,您可以将 C# 代码编译为 .net 模块,并使用 C++/CLI 链接器将一些使用 CPUID 的函数与 C# 编译器的输出相结合。您最终会得到一个由 C++/CLI 工具链生成的混合模式程序集,但其中大部分是用 C# 编写的。

对于此选项,最简单的方法可能是从调用 CPUID 的代码创建 Func<uint>Func<uint, uint> 委托,并将该委托传递给 C# 代码,而不是尝试让 C# 代码调用函数按名称(这避免了两个项目之间的循环引用)。

【讨论】:

    【解决方案2】:

    实际上...我从未这样做过,如果您希望您的代码可移植甚至与未来的 .NET 版本向前兼容,不建议这样做。然而:

    http://www.atrevido.net/blog/2005/01/28/Inline+X86+ASM+In+C.aspx

    这似乎是一个很酷的技巧。请注意,在较新的操作系统中,数据被标记为不可执行(NX 或 DEP 或任何 MS 所称的)。 C# 中的数组是数据。该页面上的最后一条评论提供了一种解决方法。

    【讨论】:

      猜你喜欢
      • 2020-11-15
      • 2010-12-12
      • 2011-03-14
      • 2022-06-13
      • 2010-11-09
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      相关资源
      最近更新 更多