我在 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();
}
}
问题是
.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 文件的编码与包含的编码文件匹配。