assembly 无法将asm dll加载到c#

zd287kbt  于 2023-03-08  发布在  C#
关注(0)|答案(1)|浏览(161)

我已经在fasm上创建了一个dll,并希望从c#运行它。但是,当我尝试运行时,我得到了一个错误
System.DllNotFoundException:"无法加载DLL" Project.dll ":访问内存地址的尝试无效。(HRESULT中的异常:0x800703E6)"
这是我代码

format   PE gui dll                 ; собираем DLL-модуль
include 'win32ax.inc'               ; макросы для укороченных директив
include 'encoding/win1251.inc'      ; подключим кирилицу
.data
mes0    db  'Библиотека Dll удачно поключена!',0      ; мессага-флаг, что DLL робит
wName   db  'Тест внешнего модуля',0                  ;  ..обзовём окно.

.code
start:                    ; точка входа!
   mov     eax,1      ; возвращаем TRUE
   ret                ;  ..в родитель LdrLoadDLL()
proc   Hello
   invoke  MessageBox,0,mes0,wName,0   ; даём о себе знать!
   ret                                 ; на выход.
endp                                       ; конец процедуры 'Hello'

.end start                ; макрос автоматом вставит секцию импорта.

section '.edata' export data readable      ;
export  'myDll.dll',\                      ; имя нашей библиотеки
     Hello, 'Hello'                    ; тут перечисляем имена всех процедур 
section '.reloc' fixups data discardable

c编号

internal class Program
{
    [DllImport("Project.dll")] public static extern void Hello();

    static void Main(string[] args)
    {
        Hello();
    }
}
hzbexzde

hzbexzde1#

问题是.reloc部分需要是readable;将其更改为:

section '.reloc' fixups data readable discardable

您可能还需要在它后面添加一个虚拟条目:

if $=$$
    dd 0,8  ; if there are no fixups, generate dummy entry
end if

或者使用以下命令:

data fixups
end data

还要确保为正确的体系结构(32位x86)编译C#项目,而不是AnyCpu。
最后一件需要修正的事情是字符编码。我可以使用MessageBoxWdu代替db来修正,但是如果你在某处指定了编码,你可以让它与MessageBoxA一起工作。确保asm文件的编码与包含的编码文件匹配。

相关问题