无法将 asm dll 加载到 c#

问题描述 投票:0回答:1

我在 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();
    }
}
c# assembly dll fasm
1个回答
1
投票

问题是

.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)而不是 AnyCpu 编译 C# 项目。

您可能需要修复的最后一件事是字符编码。我能够通过使用

MessageBoxW
du
而不是
db
来做到这一点,但如果您在某处指定编码,您可能能够让它与
MessageBoxA
一起工作。确保 asm 文件的编码与包含的编码文件匹配。

© www.soinside.com 2019 - 2024. All rights reserved.