我有以下 MASM 代码:
.386
.model flat, stdcall
option casemap :none
include \masm32\include\masm32rt.inc
.data
NewLine db 13, 10, 0
.code
LibMain proc instance:dword,reason:dword,unused:dword
mov eax, 1
ret
LibMain endp
PrintMess proc
print "Printed from assembly"
invoke StdOut, addr NewLine
ret
PrintMess endp
TestReturn proc number:dword
mov eax, number
ret
TestReturn endp
End LibMain
使用一个简单的 .def 文件:
LIBRARY MyLib
EXPORTS PrintMess
EXPORTS TestReturn
我正在从 C#调用PrintMess
和调用:TestReturn
[DllImport("MyLib")]
static extern void PrintMess();
[DllImport("MyLib")]
static extern int TestReturn(int num);
static void Main(string[] args) {
Console.WriteLine("Printed from C#");
PrintMess();
int value = TestReturn(30);
Console.WriteLine("Returned: " + value);
Console.ReadKey(true);
}
我第一次运行它时,它暂停了Console.ReadKey(true)
,我得到了预期的输出:
Printed from C#
Printed from assembly
Returned: 30
如果我然后在我的 C# 项目中进行更改,说TestReturn(30)
更改为,TestReturn(50)
那么它的行为会很奇怪。该程序终止没有错误并且不会暂停Console.ReadKey(true)
(似乎它甚至没有到达该行),这是我的输出:
Printed from C#
Printed from assembly
我必须重建装配项目。具体来说,我必须重新构建,如果我进行另一个常规构建,程序会继续出现异常。当我重建时,输出和行为恢复正常并反映输出中的数字变化。我的猜测是 Build 和 Rebuild 之间的某些不同部分破坏了 DLL。
为什么我必须重建以及如何设置它以便我不必重建?