2012-08-13 59 views
1

为了学习,我试图从C#调用汇编函数。我正在做一个尽可能简单的非常无菌项目。这是我的组件(主要是剪切和粘贴codeproject):C#调用MASM程序集DLL

.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#,我更熟悉的语言,我已经尝试了2种主要方法:反射和添加DLL作为参考。两者都给我一个错误,说预计会有一个程序集清单。我在这里输了。

我的C#很简单:

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

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

+1

使用'MASM'您可以创建不能直接从.Net应用程序引用的'native'代码。你应该“拼命”。也许你以后是'ilasm' – 2012-08-13 19:24:32

+0

我不知道为什么我没有尝试拼贴。有效。如果您将此作为答案提交,您将获得信用。 – 2012-08-13 19:28:22

回答

3

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

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

你最好还是检查一下你的DLL实际导出了函数。在Visual Studio命令提示符处,运行DLL上的dumpbin.exe/exports以查看导出的名称。有些可能性你不会看到“PrintMess”,你需要传递一个.def文件给链接器来告诉它哪些函数需要被导出。

+0

是的,一个.def文件是必需的。 – 2012-08-13 20:10:14