최근에 vc의 dll을 사용하는 프로젝트를 진행했는데 .net에서 호출해야 했기 때문에 C#에서 관리되지 않는 dll을 호출하는 방법을 연구했습니다.
먼저 dll 파일을 소개하겠습니다.
1.Dll 파일
동적 링크 라이브러리(DLL이라고도 함, "Dynamic Link Library"의 약자)는 Microsoft Windows의 가장 중요한 구성 요소 중 하나입니다. Windows 시스템 폴더를 열면 해당 폴더에 Windows의 일부 DLL 파일이 있습니다. 주요 시스템 기능은 DLL 모듈 형태로 구현됩니다.
동적 링크 라이브러리는 직접 실행될 수도 없고 메시지를 받을 수도 없습니다. 이는 특정 작업을 완료하기 위해 프로그램이나 다른 DLL에서 호출할 수 있는 함수(메서드)를 포함하는 독립 파일일 뿐입니다. ) 그러나 이러한 기능은 실행 프로그램 자체의 일부가 아니라 프로세스의 필요에 따라 요청 시 로드되며 이때만 역할을 수행할 수 있습니다.
DLL은 애플리케이션이 필요할 때만 시스템에 의해 프로세스의 가상 공간에 로드되고 호출 프로세스의 일부가 됩니다. 이때 DLL은 프로세스의 스레드에서만 액세스할 수 있으며 해당 핸들은 호출 프로세스와 호출 프로세스에서 사용됩니다. 프로세스 핸들은 DLL에서도 사용할 수 있습니다. 메모리에서 DLL은 인스턴스가 하나만 있고 해당 준비는 특정 프로그래밍 언어 및 컴파일러와 관련이 없으므로 DLL을 통해 혼합 언어 프로그래밍이 가능합니다. DLL 함수 내의 코드로 생성된 모든 개체(변수 포함)는 이를 호출하는 스레드나 프로세스의 소유입니다.
2. DLL 호출
프로그래밍 언어마다 DLL을 호출하는 방법이 다릅니다. 여기서는 C#을 사용하여 DLL을 호출하는 방법만 소개합니다. 먼저, 관리되는 것과 관리되지 않는 것을 이해해야 합니다. 일반적으로 비관리 코드는 주로 win 32 플랫폼을 기반으로 개발된 DLL과 ActiveX 구성 요소인 반면, 관리 코드는 .net 플랫폼을 기반으로 개발되었다고 생각하면 됩니다.
(1) DLL에서 관리되지 않는 함수를 호출하는 일반적인 방법
먼저 C# 언어 소스 프로그램에서 외부 메서드를 선언해야 합니다. 기본 형식은 다음과 같습니다.
[DLLImport("DLL 파일")]
수정자 extern은 변수 유형 메서드 이름(매개변수 목록)을 반환합니다.
안에:
DLL 파일: 외부 메서드를 정의하는 라이브러리 파일이 포함되어 있습니다.
수정자: 액세스 수정자, 메서드 선언 시 사용할 수 있는 추상 이외의 수정자입니다.
반환 변수 유형: DLL 파일에서 호출해야 하는 메서드의 반환 변수 유형입니다.
메소드 이름: DLL 파일에서 호출해야 하는 메소드의 이름입니다.
매개변수 목록: DLL 파일에서 호출해야 하는 메서드 목록입니다.
참고: System.Runtime.InteropServices 네임스페이스는 프로그램 선언에 사용해야 합니다.
DllImport는 메서드 선언에만 배치할 수 있습니다.
DLL 파일은 프로그램의 현재 디렉터리나 시스템에서 정의한 쿼리 경로(예: 시스템 환경 변수의 Path로 설정된 경로)에 있어야 합니다.
반환 변수 유형, 메서드 이름 및 매개변수 목록은 DLL 파일의 정의와 일치해야 합니다.
다른 함수 이름을 사용하려면 다음과 같은 EntryPoint 속성 설정을 사용할 수 있습니다.
[DllImport("user32.dll", EntryPoint="MessageBoxA")]
static extern int MsgBox(int hWnd, 문자열 msg, 문자열 캡션, int 유형);
기타 선택적 DllImportAttribute 특성:
CharSet은 다음과 같이 진입점에 사용되는 문자 집합을 나타냅니다. CharSet=CharSet.Ansi;
SetLastError는 메서드가 다음과 같은 Win32 "마지막 오류"를 유지하는지 여부를 나타냅니다. SetLastError=true;
ExactSpelling은 EntryPoint가 표시된 진입점의 철자와 정확히 일치해야 하는지 여부를 나타냅니다. 예: ExactSpelling=false;
PreserveSig는 다음과 같이 메소드의 서명을 보존해야 하는지 변환해야 하는지 여부를 나타냅니다. PreserveSig=true;
CallingConvention은 다음과 같이 진입점의 호출 규칙을 나타냅니다. CallingConvention=CallingConvention.Winapi;