C#, вызывающий библиотеку DLL сборки MASM

Ради обучения я пытаюсь вызвать функцию сборки из С#. Я работаю над очень стерильным проектом, делая все настолько просто, насколько могу. Вот моя сборка (в основном вырезана и вставлена ​​из 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#, языка, с которым я знаком гораздо лучше, я пробовал 2 основных подхода: отражение и добавление DLL в качестве ссылки. Оба дают мне сообщение об ошибке, говорящее о том, что ожидается манифест сборки. Тут я в растерянности.

Мой С# просто:

Assembly mylib = Assembly.LoadFile(@"C:\mypath\MyLib.dll");

И я получаю The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018) как ошибку в этой строке. Я ничего не знаю о сборочных манифестах. Любое направление к тому, как создать и внедрить его, будет оценено по достоинству.


person Corey Ogburn    schedule 13.08.2012    source источник
comment
используя MASM, вы создаете native код, на который нельзя напрямую ссылаться из приложений .Net. Вы должны pinvoke. Возможно, вам нужно ilasm   -  person L.B    schedule 13.08.2012
comment
Я не знаю, почему я не попробовал pinvoke. Это сработало. Если вы отправите это как ответ, вы получите кредит.   -  person Corey Ogburn    schedule 13.08.2012


Ответы (1)


Слово «сборка» может означать две вещи. Когда вы используете MASM, ассемблер означает «машинный код». Когда вы используете .NET, сборка означает «контейнер управляемого кода».

Assembly.LoadXxx() может загружать только сборки .NET, созданные с помощью инструментов .NET. он не может загружать библиотеки DLL, содержащие чистый машинный код. Вам нужно будет использовать pinvoke с атрибутом [DllImport] для вызова функций в DLL.

Вам также лучше проверить, действительно ли ваша DLL экспортирует функции. В командной строке Visual Studio запустите dumpbin.exe /exports в своей библиотеке DLL, чтобы увидеть экспортированные имена. Некоторые шансы, что вы не увидите «PrintMess», вам нужно передать файл .def компоновщику, чтобы сообщить ему, какие функции необходимо экспортировать.

person Hans Passant    schedule 13.08.2012
comment
Да, требуется файл .def. - person Corey Ogburn; 14.08.2012