【问题标题】:Calling x64 .asm file from C#?从 C# 调用 x64 .asm 文件?
【发布时间】:2012-08-23 20:47:11
【问题描述】:

我见过从 C++ Visual Studio 2010 调用的内联 32 位 .asm,使用 Microsoft 的 __fastcall 协议和整个“extern C”标头从 C++ 项目调用 x64 手写 .asm 文件,但我没有看不到 C#(我的首选语言)中的等价物。

从 C# 文件中,有没有办法在 C# Winforms 应用程序中调用手写的 64 位 .asm 文件?

【问题讨论】:

  • 基本上是的——但您需要使用unsafe 代码来实现这一点……您为什么要这样做?
  • 函数的 C++ 声明是什么样的?您可能可以调用该程序集。
  • 它是巨型 (>500mb) 位图的基本图形内容(亮度、饱和度、对比度)。如果我理解正确的话,Pinvoke 是 32 位的?
  • 那东西不值得麻烦...用 C/C++ 实现您需要的任何东西,并通过 C# 中的 DLLImport 调用该 DLL - 它会足够快...

标签: c# assembly


【解决方案1】:

如果您确实需要从 C# 执行汇编代码,请参见例如 here - 使用 unsafe 代码、指针、未损坏的委托和包含二进制形式的汇编程序的字节数组...

【讨论】:

  • 那是x86,没有x64吗? (或 x86-64)
  • 那真的很喜欢失败。正确的做法,如果有这样的事情,那就给VirtualAlloc一些实际上标记为可执行的内存。
  • 它适用于(32 位和 64 位) - 只要您使用正确的指令集,它就适用于您正在运行的任何处理器架构......它可能会在未来失败,因为安全措施,所以VirtualAlloc 路线“更安全”,尽管整个事情都不安全......
  • @harold 这很可能因为 DEP 旨在阻止此类尝试......目前我看到的最“正确”的选择是构建一个 DLL 并调用它......
【解决方案2】:

尝试查看This code project。它描述了将程序集混合到 c++ 中然后在 C# 中调用 c++ 程序集的技术。

【讨论】:

  • 在 C++ 中完成,但使用 RAX(64bit) 之类的寄存器而不是 EAX(32bit)。仅仅为了调用 64 位 asm 而编写一个调用 C++ 文件的 C# 文件似乎不奇怪吗?
  • 老实说,就个人而言,使用汇编似乎很奇怪,更不用说 c# 中的大多数非托管代码了,因此没有必要进行 hack。如果我需要组装以进行优化或诸如此类,我无论如何都会将这些部分写入 C++ DLL
  • 这就是我最初的想法,但我在 C++ DLL 上使用 x64 MASM 获得了 3 到 6 倍的加速。我想优化编译器仍然没有得到基本 Photoshop 过滤器所具有的那种真正光滑的专业感觉。
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多