我已经在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();
}
}
1条答案
按热度按时间hzbexzde1#
问题是
.reloc
部分需要是readable
;将其更改为:您可能还需要在它后面添加一个虚拟条目:
或者使用以下命令:
还要确保为正确的体系结构(32位x86)编译C#项目,而不是AnyCpu。
最后一件需要修正的事情是字符编码。我可以使用
MessageBoxW
和du
代替db
来修正,但是如果你在某处指定了编码,你可以让它与MessageBoxA
一起工作。确保asm文件的编码与包含的编码文件匹配。