假设我们使用NASM,就像他们在这个答案中所做的那样:如何在windows下汇编语言中编写how世界。
我有一些关于程序集与c#或任何其他.net语言相结合的想法和问题。
首先,我希望能够创建一个具有以下函数HelloWorld的库,该库接受该参数:
在C#中,方法签名如下所示:void HelloWorld(string name),它会打印出如下内容
你好,世界之名
我已经搜索了一点,但找不到那么多好的和干净的材料,这使我开始。不过,我知道一些以前的基本程序集,主要是gas。
因此,任何指向正确方向的指针都是非常有根据的。
对进行总结
奖金功能
在程序集或c ++中创建库时,您确实遵循了某种“预定义”方式,即c调用传递的内容,对吗?
发布于 2010-05-18 11:24:09
像这样的东西应该可以为您提供一个正常工作的DLL:
extern _printf
section .text
global _hello
_hello:
push ebp
mov ebp, esp
mov eax, [ebp+12]
push eax
push helloWorld
call _printf
add esp, 8
pop ebp
ret
export _hello
helloWorld: db 'Hello world from %s', 10, 0然后,只需使用P/Invoke调用'hello‘函数即可。它本身不会清理,所以您需要将CallingConvention设置为Cdecl;您还需要告诉它您正在使用ANSI字符串。还没经过测试,但应该能正常工作。
using System.Runtime.InteropServices;
namespace Test {
public class Test {
public static Main() {
Hello("C#");
}
[DllImport("test.dll", EntryPoint="hello", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
public static extern Hello(string from_);
}
}发布于 2010-05-18 11:38:44
我将首先介绍做你想做的事的基本准则。然后,我将尝试解释如何做Hello示例。
第一步是编写函数,并从中生成dll。程序集中的函数应该遵循调用标准之一,stdcall是最常见的调用标准(您可以阅读更多关于stdcall和其他调用标准这里的信息)--使用这里创建dll的示例可以找到。
第二步是使用P/Invoke以托管语言导入方法。您可以阅读更多关于它的这里。
就这样..。
现在,对于前面提到的示例,您需要创建一个asm函数,该函数接受所有输入参数,并将其传递给其他一些知道如何打印到stdout的函数(如上面提到的标准c中的printf,或者使用像这里这样的winapi调用)。
之后,您将需要将dll导入到C#中,如前所述。您应该特别注意的是字符串的字符编码和数据的清理。在我提供的第三个链接(封送文本部分)中都提到了它们。
奖金部分:
发布于 2010-05-18 11:28:32
在我看来,你的问题有两个方面:
对2的答案是使用P/Invoke。有关该主题的大量文档和教程,例如http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
https://stackoverflow.com/questions/2856624
复制相似问题