首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在程序集中创建Hello库函数并从C#调用它

问在程序集中创建Hello库函数并从C#调用它
EN

Stack Overflow用户
提问于 2010-05-18 11:10:46
回答 3查看 3K关注 0票数 5

假设我们使用NASM,就像他们在这个答案中所做的那样:如何在windows下汇编语言中编写how世界。

我有一些关于程序集与c#或任何其他.net语言相结合的想法和问题。

首先,我希望能够创建一个具有以下函数HelloWorld的库,该库接受该参数:

  • 名字

在C#中,方法签名如下所示:void HelloWorld(string name),它会打印出如下内容

你好,世界之名

我已经搜索了一点,但找不到那么多好的和干净的材料,这使我开始。不过,我知道一些以前的基本程序集,主要是gas。

因此,任何指向正确方向的指针都是非常有根据的。

对进行总结

  • 在ASM ( NASM )中创建一个接受一个或多个参数的例程
  • 编译并创建具有上述功能的库
  • 将库包含在任何.net语言中
  • 调用包含的库函数

奖金功能

  • 如何处理返回的值?
  • 可以内联地编写ASM方法吗?

在程序集或c ++中创建库时,您确实遵循了某种“预定义”方式,即c调用传递的内容,对吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-18 11:24:09

像这样的东西应该可以为您提供一个正常工作的DLL:

代码语言:javascript
复制
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字符串。还没经过测试,但应该能正常工作。

代码语言:javascript
复制
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_);
    }
}
票数 11
EN

Stack Overflow用户

发布于 2010-05-18 11:38:44

我将首先介绍做你想做的事的基本准则。然后,我将尝试解释如何做Hello示例。

第一步是编写函数,并从中生成dll。程序集中的函数应该遵循调用标准之一,stdcall是最常见的调用标准(您可以阅读更多关于stdcall和其他调用标准这里的信息)--使用这里创建dll的示例可以找到。

第二步是使用P/Invoke以托管语言导入方法。您可以阅读更多关于它的这里。

就这样..。

现在,对于前面提到的示例,您需要创建一个asm函数,该函数接受所有输入参数,并将其传递给其他一些知道如何打印到stdout的函数(如上面提到的标准c中的printf,或者使用像这里这样的winapi调用)。

之后,您将需要将dll导入到C#中,如前所述。您应该特别注意的是字符串的字符编码和数据的清理。在我提供的第三个链接(封送文本部分)中都提到了它们。

奖金部分:

  • 返回值的处理取决于所使用的调用约定。
  • 不可能用C#编写内联程序集。但是,您可以使用托管C++编写它们。
票数 3
EN

Stack Overflow用户

发布于 2010-05-18 11:28:32

在我看来,你的问题有两个方面:

  1. 如何使用程序集编写函数并将其放入DLL中?
  2. 如何从托管C#调用非托管DLL中的函数?

对2的答案是使用P/Invoke。有关该主题的大量文档和教程,例如http://msdn.microsoft.com/en-us/magazine/cc164123.aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2856624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档