2012-08-13 82 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