class에서 접근 지정자에 대해 공부하다가 extern, internal이라는 특이한 지정자가 있어 정리했다.
어디서나 접근 가능한 지정자
자신과 상속받은 자식만 사용할 수 있게하는 지정자
자신만 사용할 수 있게 하는 지정자
C#과 같은 managed code에서 C/C++ 같은 언어로 만들어진 unmaged code의 기능을 사용하는 수단
아래 예시는 user32.dll의 MessageBeep라는 메서드를 사용한다
(이름 정확해야함)
class Program
{
[DllImport("user32.dll")]
static extern int MessageBeep(uint uType);
static void Main(string[] args)
{
MessageBeep(0); //시스템 소리가 난다
}
}
비주얼스튜디오 안에 프로젝트2개만들고
하나는 라이브러리, 하나는 콘솔 프로젝트로 설정
콘솔 프로젝트에서 라이브러리 클래스를 참조하고, 테스트 진행
예) ConsoleApp1 이라는 클래스 라이브러리와 ConsoleApp2 라는 콘솔 프로젝트
1. ConsoleApp1 프로젝트 속성 → 출력 형식(Output type) → Class Library
ConsoleApp1 코드
using System;
namespace ConsoleApp1
{
internal class BlockClass
{
public int count = 5;
internal int number = 50;
static public int staticNumber = 10;
internal void SayHello()
{
Console.WriteLine("Hello");
}
}
public class FreeClass
{
public int count = 10;
public void SayBye()
{
Console.WriteLine("Bye");
}
internal void BlockHi()
{
Console.WriteLine("접근불가");
}
}
class Program
{
static void Main(string[] args)
{
}
}
}
2. ConsoleApp2에서 DLL 참조 추가 및 사용
프로젝트 참조에 마우스우클릭 - 참조추가- 프로젝트 - 체크후 확인
using ConsoleApp1; 추가 후 사용
코드
using System;
using ConsoleApp1;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
FreeClass freeClass = new FreeClass();
freeClass.SayBye();
//▼보호수준때문에 접근불가라고 뜸
//BlockClass myClass = new BlockClass(); //에러.
//freeClass.BlockHi(); //에러. 보호수준
//int num = freeClass.number; //에러. 보호수준
}
}
}
internal 정리할때 다른 어셈블리에서 사용해야 internal이 동작한다는게
무슨 의미인지 몰라서 시간을 많이 소모했다.
프로젝트를 2개로 나누고 위 방법처럼 클래스라이브러리 + 콘솔라이브러리로 설정하니 해결되었다.