这是一个非常好的问题,值得我投票。关于您的问题,正如 Cody 指出他的汇编程序例程那样,这样做的唯一方法是在此基础上构建一个 DLL,然后从那里使用 p/Invoke 使用互操作,例如
[DllImport("mylib.dll")]
等等。然而,不幸的是,由于 C# 或任何其他语言的性质,CLR 运行时环境正在使用托管代码。让 CLR 或汇编器设置堆栈帧、寄存器,然后从本地世界交叉跳转到托管世界会很尴尬。那将是一项艰巨的工作,但是如果有人看到过这种事情,请在我的答案末尾发表评论,我会相应地修改此答案。
因此,据我所知,没有办法通过汇编程序在这种情况下使用 eax、ebx、堆栈帧等系统寄存器将汇编程序例程内联到 CLR 代码中,就像 Cody 的代码示例一样上面已经在他的回答中提供了。在这种情况下,对于 C/C++ 来说也是如此:
无效富(无效){
_asm{
异或 ecx, ecx
移动 eax, 1
……
}
}
从 CLR 的角度来看,这样做是很好的,以便进一步优化代码,至少在理论上是这样,但对于 CLR 来说,实际托管这样的事情是一项不可逾越的工作,但有一个例外.. . 可以使用可以执行此操作的托管 C++ 编译器来完成,但无论如何都不能来自 VB.NET/C#:
私人无效mycsfunction(字符串s){
// 托管代码
StringBuilder sb = new StringBuilder(s);
……
_asm{
推送ebp
mov ebp, esp
lea edx, offset sb
……
移动 eax, 1
流行音乐
}
}
然而,在这个主题上,可以将 IL 代码生成到本地汇编程序,现在,当我写这篇文章时,我不能 100% 确定这是否可以反过来完成,请参阅此处以获取有关如何执行此操作的详细说明可以发生
但是,处理 CLR 汇编的唯一方法是手写 IL 代码并对其进行编译,即直接使用 CLR 运行时的汇编程序,与本机汇编程序可以被本机调用非常相似(阅读 NON -CLR 二进制文件),请参阅此处的这篇文章,了解如何完成此操作。