我怎样才能从 C# 调用 Assembly 过程并返回结果?

How can I call an Assembly procedure from C# and get a result back?

我正在尝试从 C# 中调用一个非常简单的汇编过程,以从中获取一些 returned 内容。

这是 C# 代码:

class Program
{
    static void Main(string[] args)
    {
        ulong test = Start();

        Console.WriteLine(test);
    }

    [DllImport(@"C:\dev\masm\basic.dll")]
    private static extern ulong Start();
}

这是程序集 (MASM) 代码:

.code
Start proc
    mov rax, 1
    ret
Start endp

end

I assemble 和 link 从控制台使用以下命令:

ml64 basic.asm /link /subsystem:console /entry:Start /out:basic.dll /dll /machine:x64

真正有趣的是,我能够成功调用打印“Hello, World!”的简单组装过程。但 return 什么都没有。然而,当我尝试调用这个过程时,即使我在 DLL 中指定了一个入口点,我仍然得到这个错误:

System.EntryPointNotFoundException: 'Unable to find an entry point named 'Start' in DLL 'C:\dev\masm\basic.dll'.'

我很可能遗漏了什么,但我想不通。

你们太亲密了!您需要将程序标记为导出。

.code
Start proc export
    mov rax, 1
    ret
Start endp

end

Console.WriteLine(test); 现在打印 1.

您可以使用开发控制台和 运行 DUMPBIN /HEADERS <DLL> 验证 Start 过程是否已导出,并在导出部分看到它

File Type: DLL

  Section contains the following exports for basic.dll

    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA      name

          1    0 00001000 Start

  Summary

        1000 .rdata
        1000 .text

旁白:您遇到的错误

System.EntryPointNotFoundException: 'Unable to find an entry point named 'Start' in DLL 'C:\dev\masm\basic.dll'.'

实际上与 dll 的入口点(通常称为 Main)无关,但它是一个 PInvoke 术语,基本上意味着“嘿,我们找不到您告诉我们的导出的“Start”方法寻找。"