我目前正在C++包装器中使用masm来开发.dll
,以便其他应用程序可以使用它,尤其是Visual Studio 2022 中的C#应用程序
然而,以这种方式开发也有一些很大的缺点。Visual Studio在让MASM正常工作方面有很多小麻烦,比如如果asm源中"包含"了一个文件,则可以正确构建。这样的文件也不能有断点。这意味着我必须使用一个大文件,这变得非常笨拙。
它就像微软已经放弃了对MASM的支持,除非有办法构建一个允许调试的DLL?
或者,如果Visual Studio调试问题没有简单的解决方案,是否有更好的方法在Windows上开发x64.dll?
工作示例。我能够逐步完成c代码并进入汇编代码。基于程序集的DLL的目录为c:\xcadll。
xa.asm:
includelib msvcrtd
includelib oldnames ;optional
.data
.data?
.code
public DllMain
DllMain proc ;return true
mov rax, 1
ret 0
DllMain endp
include xb.asm
end
xb.asm:
public Example
Example proc ;[rcx] = 0123456789abcdefh
mov rax, 0123456789abcdefh
mov [rcx],rax
ret 0
Example endp
end
Program.cs-用于调用dll的调试版本:
using System;
using System.Runtime.InteropServices;
namespace Program
{
class Program
{
[DllImport("c:\xcadll\x64\debug\xcadll.dll")]
static extern void Example(ulong[] data);
static void Main(string[] args)
{
ulong[] data = new ulong[4] {0,0,0,0};
Console.WriteLine("{0:X16}", data[0]);
Example(data);
Console.WriteLine("{0:X16}", data[0]);
return;
}
}
}
DLL构建的项目设置:
为程序集(或C或C++(代码创建.dll项目:
project properties: Debug | x64
xa.asm的属性:
General / Excluded From Build: No
Custom Build Tool / Command Line: ml64 /c /Zi /Fo$(OutDir)xa.obj xa.asm
Custom Build Tool / Outputs: $(OutDir)xa.obj
C#版本的项目设置:
创建C#项目
project properties: Debug | x64
如上面的示例代码所示,C#程序需要导入DLL的调试版本。