为了学习,我试图用C#调用汇编函数。我正在一个非常无菌的项目中尽我所能地做所有事情。这是我的装配(主要是从codeproject剪切和粘贴):
.386
.model flat, stdcall
option casemap :none
include \masm32\include\masm32rt.inc
.code
LibMain proc instance:dword,reason:dword,unused:dword
mov eax,1
ret
LibMain endp
PrintMess proc
print "Test"
exit
PrintMess endp
End LibMain
注意:程序集构建得很好。没有错误,唯一的警告是masm32rt.inc有另一个汇编器忽略的.model
行,这个警告没问题。我使用these instructions设置了我的环境。
对于C#,我更熟悉的一种语言,我尝试了两种主要方法:反射并添加DLL作为参考。两者都给我一个错误,说明了一个程序集清单。我在这里输了。
我的C#很简单:
Assembly mylib = Assembly.LoadFile(@"C:\mypath\MyLib.dll");
我在这一行得到The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018)
错误。我对装配清单一无所知。任何关于如何创建和嵌入一个方向的方向都将受到赞赏。
答案 0 :(得分:3)
“汇编”这个词可能意味着两件事。使用MASM时,汇编表示“机器代码”。使用.NET时,程序集意味着“托管代码的容器”。
Assembly.LoadXxx()只能加载使用.NET工具创建的.NET程序集。它无法加载包含纯机器代码的DLL。您需要使用带有[DllImport]属性的pinvoke来调用DLL中的函数。
您还可以更好地检查您的DLL是否实际导出了这些函数。在Visual Studio命令提示符下,在DLL上运行dumpbin.exe / exports以查看导出的名称。你不会看到“PrintMess”的一些可能性,你需要将.def文件传递给链接器,告诉它需要导出哪些函数。