C# 2006/12/10 19:56

C#에서 dll을 링크 3

dll 링크 세번째 이번에는 포인터 ㅡ.ㅡ; 별쓰데 없는것에 다 한다는 생각이 든다. 불현듯 아참 C#은 포인터를 안쓰지?? 라는 생각에서 그럼 포인터를 사용한 dll을 이용할수 있을까나??? 이런 생각이 또 들었다. 아참~~ 이 꼬리에 꼬리는 무는 잡생각들~~

어째던 아래와 같이 dll을 만들었다.


extern "C" __declspec(dllexport)void IntSwap(int * a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
extern "C" __declspec(dllexport)void LongSwap(long * a,long * b)
{
long temp;
temp = *a;
*a = *b;
*b = temp;
}
 


포이터의 단골 주제인 Swap이다. 음...

이제는 C#코드인데..... 조금 생각을 해봤다. 과연 포인터의 인자값을 어떻게 넘길것인가에 대한 것. 여러 궁리 끝에 드디어 ref를 이용해서 dll 함수를 쓸수 있게 되었다. 음.. 역시 그럼 이제 C#으로 안되는것은 별로 없네.. 라는 생각이 들었다.


using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace DllPointer
{
  class Program
  {
       [DllImport("DllSwap.dll",CharSet=CharSet.Ansi)]
       public static extern void IntSwap(ref int a,ref int b);
       [DllImport("DllSwap.dll", CharSet = CharSet.Ansi)]
       public static extern void LongSwap(ref long a, ref long b);
       static void Main(string[] args)
       {
           int a = 10;
           int b = 20;
           IntSwap(ref a, ref b);
           Console.WriteLine("a = {0}, b = {1}",a,b);
           long c = 10000000;
           long d = 20000000;
           LongSwap(ref c, ref d);
           Console.WriteLine("c = {0}, d = {1}",c,d);
       }
  }
}
 


User inserted image

C# 2006/12/07 23:29

C#에서 dll을 링크 1

C#으로는 .Net Framwork의 제약때문에 갑갑한 프로그램을 해야 한다. 그래서 지원되지 않는 것은 api를 참조해서 써야 된다.

지난번에 후킹 프로그램을 만들때도 거의 모든것을 api를 사용하여서 만들었는데 또한 전역 후킹 프로그램을 만들려고 한다면 그 후킹 메세지를 dll로 처리 해야 한다. 그런데 그 dll은 또 .Net Framwork에서 만든 dll이 아닌 일반 win32 로 만들어 놓은 dll을 사용하여야 한다.(뭐가 이리 복잡혀??)

그래서 지난번 애먹은것도 있고 해서 한번 해봤다. 잘될지..

먼저 간단하게 두 매개변수의 합을 구하는 dll 함수로 만들어 봤다. vc로 만들어 컴파일을 했다.


extern "C" __declspec(dllexport)int AddInteger(int a,int b)
{
return a+b;
}
 


그리고 이 dll파일을 가지고 솔루션 탐색기의 참조 부분에서 열라게 ^^;; 참조를 해 봤다. 그런데 dll형식이 알수 없다? 는 에러 메세가 나왔다..(이게 웬걸 ㅡ.ㅡ;) 그래서 나는 무슨 다른 방법이 있나?? 고민을 들었다. 일단 소스 코드가 있는 프로젝트 폴더에 dll과 lib파일을 넣어 놓구 컴파일을 해봤다 그런데 이게 왠걸...



User inserted image



에러가 났다...

그래서 에라이 모르겠다. 싶어서 그냥 디버그 폴더에다가 dll 파일과 lib 파일을 같이 집어 넣어 컴파일을 하니 이게 왠걸 실행이 나와 버렸다.



User inserted image





C#코드


위에 결과를 보면 3이라는 결과가 잘 나왔다.

그렇다면 결론은 .Net Framework에서 만들지 아니한놈은 내가 디버그를 하던 릴리즈를 하던 계속 컴파일 한후에 복사하고 붙여 넣기 복사하고 붙여 넣기 이짓 거리를 해야 된다는 얘기인데....... 깔끔한 성격이 나로써는 참을수 없는 결과다. 분명 MS사에서도 나같은 성격자를 위해서 무언가를 해놨을것이다.. 그것을 찾아 봐야 겠다.

쉬울줄 알았다... 제목에서도 나타낸것 처럼 dll을 링크하는데 한참 헤맸다. 그것도 mfc로 따로 만들어준 dll을 링크 하는것 코드 구루에서 코드를 구해서 내가 다시 만들려고 했는데 안됐다. 줸장.. 니 까짓게 뭔데 나를 좌절에 빠지게 하삼???

좌절에 빠지게 한 이 프로그램이 만들어 놓으니 좋은건 좋은거 같다. 어떻게 하루 만에 걸리는지. 정말 바보 같다. 그래도 어째건 프로그램이 동작은 잘 됬다.





소스


div>