1

为了学习,我试图从 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行被汇编器忽略,这个警告很好。我已经使用这些说明设置了我的环境。

对于我更熟悉的一种语言 C#,我尝试了两种主要方法:反射和添加 DLL 作为参考。两者都给我一个错误,说需要一个程序集清单。在这里我输了。

我的 C# 很简单:

Assembly mylib = Assembly.LoadFile(@"C:\mypath\MyLib.dll");

The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018)在那条线上得到了一个错误。我对装配清单一无所知。任何有关如何创建和嵌入的方向都将不胜感激。

4

1 回答 1

3

“组装”一词可能意味着两件事。当您使用 MASM 时,汇编意味着“机器代码”。当您使用 .NET 时,程序集意味着“托管代码的容器”。

Assembly.LoadXxx() 只能加载使用 .NET 工具创建的 .NET 程序集。它不能加载包含纯机器代码的 DLL。您需要使用带有 [DllImport] 属性的 pinvoke 来调用 DLL 中的函数。

您还最好检查您的 DLL 是否确实导出了函数。在 Visual Studio 命令提示符处,对 DLL 运行 dumpbin.exe /exports 以查看导出的名称。您可能看不到“PrintMess”,您需要将 .def 文件传递​​给链接器以告诉它需要导出哪些函数。

于 2012-08-13T19:33:19.747 回答