【发布时间】:2021-11-18 19:09:59
【问题描述】:
我正在尝试从 C# 中调用一个非常简单的组装过程以从中返回一些内容。
这是 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
我使用以下命令从控制台组装和链接:
ml64 basic.asm /link /subsystem:console /entry:Start /out:basic.dll /dll /machine:x64
真正有趣的是,我能够成功调用一个打印“Hello, World!”的简单组装程序。但不返回任何东西。但是,当我尝试调用此过程时,即使我在 DLL 中指定了一个入口点,我仍然会收到此错误:
System.EntryPointNotFoundException: 'Unable to find an entry point named 'Start' in DLL 'C:\dev\masm\basic.dll'.'
我很可能错过了什么,但我想不通。
【问题讨论】:
-
您需要研究 P/Invoke 的机制,尤其是调用约定的工作原理。另请注意,Assembly 一词对 C# 和其他 .NET 程序员具有非常特殊的含义(它与打包有关,而不是操作码语言)。您的问题标题具有欺骗性。
-
不幸的是,“外部”没有为我做这件事,@zx485。是的,在 C# 和 .NET 的上下文中,“Assembly”这个词是完全正确的。感谢您提供有关 P/Invoke 的提示。
-
是的。我误会了。很抱歉。