我怎样才能从 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”方法寻找。"
我正在尝试从 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”方法寻找。"