上周我一直在用头撞砖墙。那面砖墙:CPUID。
我偶然发现的所有内容都说要在 C++ 中构建一个实现 CPUID 的类库,然后在 C# 项目中使用它。
由于各种原因,我一直无法让 C++ 类库在我的 C# 项目中正常工作,我正要放弃并告诉客户他们的请求无法满足。但是,我已经走到了尽头,想寻求帮助。
有什么方法可以让__cpuid () 或 asm 在 C# 中编译而无需构建外部程序集?
上周我一直在用头撞砖墙。那面砖墙:CPUID。
我偶然发现的所有内容都说要在 C++ 中构建一个实现 CPUID 的类库,然后在 C# 项目中使用它。
由于各种原因,我一直无法让 C++ 类库在我的 C# 项目中正常工作,我正要放弃并告诉客户他们的请求无法满足。但是,我已经走到了尽头,想寻求帮助。
有什么方法可以让__cpuid () 或 asm 在 C# 中编译而无需构建外部程序集?
需要非 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# 代码按名称调用函数(这避免了之间的循环引用两个项目)。
实际上......我从来没有这样做过,如果您希望您的代码可移植甚至与未来的 .NET 版本向前兼容,不建议这样做。然而:
http://www.atrevido.net/blog/2005/01/28/Inline+X86+ASM+In+C.aspx
这似乎是一个很酷的技巧。请注意,在较新的操作系统中,数据被标记为不可执行(NX 或 DEP 或任何 MS 所称的)。C# 中的数组是数据。该页面上的最后一条评论提供了一种解决方法。