본문 바로가기

Developement

C# 에서 일반 DLL 가져다 쓰기.

C# 이 편리한 언어라고들은 합니다만 ..
사실 저는 편한지 전혀 모르겠습니다 -_-a
Java 처럼 가져다 쓰기 편하다는 의미로서는 그 의미대로 편한 것 이 맞는 말 입니다만 ...
개발자가 그런 편리함으로 "편리하다" 라고 하는 건 사실 개발자로서의 자질이 의심 된다고 생각 되네요 ..
어찌되었든..
minGW (gcc) 에서 빌드한 32bit DLL 을 C# 에서 쓸수 있는걸까? 라는 생각을 해 본 결과 : 된다 입니다.
다만 테스트 한 환경이 XP 인데다 32bit OS 이므로 64bit OS 에서는 void* 타입이 4byte 가 아니고 8byte 이므로 분명히 문제가 생길 것으로 생각 되는군요.

일단 이전에 공유한 SHARERES.DLL 을 붙여다 보았습니다.
동작은 .. 됩니다.
DLL 을 가져다 쓰기 위해서는 다음 코드 처럼 만들어두었습니다.

아직 64bit 에서는 어떻게 되지? 라는 의문을 해결 하지 못하였으므로 ...
좀 더 고려 해 본 다음 포스티 해야 겠습니다.
아마 minGW 를 64bit 로 빌드한 걸로 따로 들고 있으면서 C# 에서 조건에 따라 다른 DLL 을 로드 하도록 바꿔야 할거 같기도 합니다.

C# 에서는 void* 가 없으므로 IntPtr 과 Marshal 을 적절히 조합해야 합니다.
저는 이게  정말 무지 완전 귀찮더군요 ... -_-;;;
Delphi 에서는 Type-casting 한방으로 되는걸 C# 에서는 무지막지한 노가다를 ... ㄷㄷㄷ ...

일단 SHARERES.DLL 이 문자열을 저장/로드 하도록 만든 것이 아니므로 WPF+C# 에서는 문자열이 Unicode 가 된다는 점 들을 고려 해야 합니다...

또한 Win32 APP 를 함꼐 DLL 로드하게 되면 좀 이상해 지는 버그도 있는 듯 합니다.

이후에 대한 정보는 좀 더 연구를 해 보아야 하겠네요 ...
C# .. 저는 싫네요 ... 뭐 이딴 언어가 ... OTL ...

MinGW 나 Delphi 처럼 별도 DLL 이 없어도 돌아가야 하는 바이너리를 못 만드는 언어는 무섭습니다 ..
물론 거기엔 MFC 포함 입니다.

ps.
테스트에 사용된 Release 바이너리를 포함 합니다.
단, 이 테스트 프로그램을 돌리시려면 무척 덩치 큰 dotNet Framework v3.5 가 설치되어 있어야  합니다.
WPF 로 돌아가 가기 때문이기도 합니다.