2012-08-13 5 views
1

학습을 위해 C#에서 어셈블리 함수를 호출하려고합니다. 나는 가능한 한 모든 것을하는 매우 살균적인 프로젝트에서 일하고 있습니다.C#에서 MASM 어셈블리 DLL 호출

.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 

참고 : 여기에 (대부분 잘라 codeproject에서 붙여 넣기) 내 조립의 조립이 잘 구축합니다. 오류가없고 masm32rt.inc에 어셈블러가 무시하는 다른 .model 행이 있다는 경고 만 표시됩니다.이 경고는 정상입니다. these instructions을 사용하여 환경을 설정했습니다.

C# 언어의 경우 훨씬 익숙한 데 반해 Reflection과 DLL을 참조로 추가하는 두 가지 방법을 시도했습니다. 둘 다 어셈블리 매니페스트가 필요하다는 오류를 나에게줍니다. 여기 나는 잃어 버렸어.

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

그리고 그 라인에 오류로 The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018)을 얻을 :

내 C#을 단순히. 어셈블리 매니페스트에 대해서는 아무 것도 모른다. 하나를 생성하고 삽입하는 방법에 대한 모든 방향을 이해할 수 있습니다.

+1

'MASM'을 사용하면 .Net 어플리케이션에서 직접 참조 할 수없는'native' 코드를 생성합니다. 당신은 당신이'pinvoke'해야합니다. 어쩌면 당신이 ilasm 뒤에 무엇입니까 –

+0

왜 내가 pinvoke 시도하지 않았다. 그것은 효과가 있었다. 답변을 제출하면 크레딧을 받게됩니다. –

답변

3

"어셈블리"라는 단어는 두 가지 의미가 있습니다. MASM을 사용하면 어셈블리는 "기계 코드"를 의미합니다. .NET을 사용하면 어셈블리는 "관리되는 코드의 컨테이너"를 의미합니다.

Assembly.LoadXxx()는 .NET 도구로 만든 .NET 어셈블리 만로드 할 수 있습니다. 순수한 기계 코드를 포함하는 DLL을로드 할 수 없습니다. DLL의 함수를 호출하려면 [DllImport] 특성과 함께 pinvoke를 사용해야합니다.

또한 DLL이 함수를 실제로 내보내는 지 확인하는 것이 좋습니다. Visual Studio 명령 프롬프트에서 DLL에 dumpbin.exe/exports를 실행하여 내 보낸 이름을 확인합니다. "PrintMess"가 표시되지 않을 확률이 높기 때문에 .def 파일을 링커에 전달하여 내보낼 함수를 지정해야합니다.

+0

그래, .def 파일이 필요합니다. –