c# DllImport 대신 LibraryImport

최신 비주얼 스투디오는 DllImport를 쓰면 LibraryImport로 바꾸라고 경고한다. 전자는 오래되었고 느리기 때문이다.

LibraryImport의 기본 형태는 아래와 같다.

[LibraryImport("kernel32.dll")] private static partial uint GetCurrentProcessorNumber();

access modifier는 생략할 수 없다.

정적으로만 이용할 수 있으므로 static으로 해야 한다.

컴파일러가 다른 파일에 자동으로 코드를 추가할 거라 partial로 해야 한다.

정수와 달리 bool이나 string은 마셜을 해야 한다. unmanaged의 정수와 .네트의 그것은 구조가 같지만 bool과 string은 그렇지 않기 때문이다.

[LibraryImport(@"kernel32.dll")][return: MarshalAs(UnmanagedType.Bool)] private static partial bool TestMethod(...

marshal은 serialize + convert라고 이해하면 좋다.

DllImport로 구현을 하면 비주얼 스투디오 안내에 따라 자동으로 LibraryImport를 이용한 코드로 바꿀 수 있다. 하지만 완벽하지는 않다.

일단 자동으로 바꾸면 변환된 코드는 인텔리센스가 오류로 인식한다. 이를 무시하고 빌드를 하면 컴파일러가 자동으로 코드를 추가하여 오류를 없앤다.

반환 값과 마찬가지로 패러미터도 마셜을 해야 한다. 비주얼 스투디오가 이거까지 자동으로 바꾸진 않는다. 어떤 코드 패이지를 써야 하는지 모르기 때문이다.

[LibraryImport(@"C:\ls api\xingAPI.dll")][return: MarshalAs(UnmanagedType.Bool)]
public static partial bool TestMethod([MarshalAs(UnmanagedType.LPStr)] string testString, ...

패러미터가 유니코드 문자열이면 LPWStr, ansi면 LPStr로 설정한다. 오래 된 dll이면 ansi이고 최근 거면 유니코드일 가능성이 크다.