次の 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
アセンブリ プロジェクトを再構築する必要があります。具体的には、再ビルドする必要があります。別の通常のビルドを行うと、プログラムは引き続き誤動作します。再構築すると、出力と動作が正常に戻り、数値の変更が出力に反映されます。私の推測では、DLL を部分的に壊している Build と Rebuild の間で何かが違うということです。
再構築する必要があるのはなぜですか?また、再構築する必要がないように設定するにはどうすればよいですか?