簡體   English   中英

C#調用MASM程序集DLL

[英]C# calling a MASM Assembly DLL

為了學習,我試圖用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) The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018)作為該行的錯誤。 我對裝配清單一無所知。 任何關於如何創建和嵌入一個方向的方向都將受到贊賞。

“匯編”這個詞可能意味着兩件事。 使用MASM時,匯編表示“機器代碼”。 使用.NET時,程序集意味着“托管代碼的容器”。

Assembly.LoadXxx()只能加載使用.NET工具創建的.NET程序集。 它無法加載包含純機器代碼的DLL。 您需要使用帶有[DllImport]屬性的pinvoke來調用DLL中的函數。

您還可以更好地檢查您的DLL實際導出函數。 在Visual Studio命令提示符下,在DLL上運行dumpbin.exe / exports以查看導出的名稱。 你不會看到“PrintMess”的一些可能性,你需要將.def文件傳遞給鏈接器,告訴它需要導出哪些函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM