암호화프로그래밍/C#-BigInteger

001. BigInteger 라이브러리 작성을 위한 프로젝트 생성

산을좋아한라쯔 2013. 10. 17. 11:41
반응형

 

1. BigInteger 라이브러리 작성을 위한 프로젝트 생성

Java에는 BigInteger클래스가 기본 API로 제공된다. 그렇지만 C#에는 없어서 큰 수를 다루는 프로그래밍을 할 때는 자체 제작을 해야 한다.

 

이번 장에서는 앞에서 C로 제작한 '큰 정수'관련 함수들을 이용해서 C#용 BigInteger라이브러리를 만들어 보기로 하겠다.

구조는 C로 만든 함수들을 DLL호출하는 형식으로 하고, 생성자나 메서드들은 Java의 BigInteger 클래스와 유사하게 제작하도록 하겠다.

 

개발 환경 구축

Microsoft Visual Studio를 사용하도록 하겠다. 사용된 버전은 한글판 Visual Studio 2010 Professional

 

프로젝트 생성

C#용 BigInteger 라이브러리를 생성하기 위해서, Visual Studio에서 신규 프로젝트를 만들도록 하자.

 

  • 메뉴에서 "파일 - 새로만들기 -프로젝트"
  • 새 프로젝트 화면에서 아래와 같이 지정 (다르게 지정해도 무방)
    • 탬플릿: 클래스 라이브러리
    • 이름: BigInteger
    • 위치: .....\II.BigInteger_C#   
    • 솔루션 이름: BigInteger
    • '솔루션용 디렉터리 만들기' 체크

 

 

 

 

BigInteger클래스 작성

위에서 만든 BigInteger프로젝트 밑에 BigInteger.cs파일을 만든다. 디폴트로 생성되어 있는 Class1.cs파일의 이름을 변경해도 된다.

이 BigInteger.cs에 BigInteger클래스와 관련된 코딩을 하게 될 텐데, 먼저 C로 만든 BigInt함수들을 DLL호출할 수 있게 조치한 후 작성토록 하자.

 

BigInt 삽입

C로 작성된 BigInt프로젝트를 삽입하도록 하자.

  • BigInt프로젝트의 전체 폴더를 BigInteger폴더 밑으로 복사 (Visual Studio에서가 아닌, 윈도우즈 파일 탐색기를 이용해서 복사하는 것을 말함)

        

  • Visual Studio의 '솔루션 탐색기'에서 '추가-기존 프로젝트'를 누르고, 앞에서 복사한 BigInt폴더내 BigInt.vcxproj선택해서 BigInt프로젝트 추가

   

 

  • BigInt프로젝트를 DLL 프로젝트로 변환
    • 솔루션탐색기에서 BigInt프로젝트 선택해서 마우스 우클릭 후 '속성'선택
    • 구성 속성/일반에서 '구성 형식'을 '동적 라이브러리(.dll)'로 지정
    • DLL출력경로 변경: BigInt프로젝트 속성의 '구성 속성/출력 디렉토리'를 아래와 같이 하면 됨
                                  $(SolutionDir)$(SolutionName)\bin\$(Configuration)\
                                  그러면, ......\BigInteger\bin\Debug\ 디렉토리가 됨
    • DLL출력경로 변경: BigInt프로젝트 속성의 '구성 속성/출력 디렉토리'를 아래와 같이 하면 됨
        $(SolutionDir)$(SolutionName)\bin\$(Configuration)\
    • '구성속성/C C++/고급'에서 호출규칙이 __cdecl(/Gd)로 변경
            <-- pInvoke stackImbalance에러 방지용임     
    • bigint.h에서 C#에서 call해서 사용할 함수들 앞에  문구 삽입: __declspec(dllexport) 
    • 솔루션 전체 빌드 해준다.
      그러면, BigInt.dll이 생성됨을 알 수 있다.
      위치: .......\II.BigInteger_C#\BigInteger\BigInteger\bin\Debug\

 

BigInteger.cs 환경 세팅

  • DllImport 사용할 수 있게
    • BigInteger.cs의 using 선언하는 부분에 DllImport를 사용할 수 있게 추가: using System.Runtime.InteropServices;
    • DLL에 있는 함수를 Import할 때는 아래와 같이 하게 된다. 
          [DllImport("BigInt.dll", CallingConvention=CallingConvention.Cdecl)]
          private static extern int bit_or(UInt32[] a, UInt32[] b, UInt32[] c);
    • BigInt.dll은 위에서 이미, BigInteger프로젝트가 실행되는 곳에다 생성되도록 했기에, BigInteger클래스에서 접근가능하겠다. 
  • 디버그할 때 C소스까지 디버그 가능하도록 세팅
    •  BigInt Calculator프로젝트 속성에서, 디버그항목에서, "비관리 코드 디버깅 사용" 체크
    • 이렇게 하면, C로 작성되어 있는 BigInt프로젝트의 소스까지 디버깅모드에서 접근 가능하게 됨

BigInteger.cs 코딩

이 부분은 다음장부터 차근차근 작성토록 하자

 

 

반응형