14. [C#,닷넷교육강좌]어셈블리의 호출 예제,C# assembly호출,assemblyinfo.cs.dll참조,C#/WPF/닷넷WPF/ASP.NET/ADO닷넷/닷넷교육/닷넷강좌학원/닷넷공부/닷넷책/닷넷객체지향교육,오라클자바
VS에서 새 프로젝트 후 C# 콘솔 응용 프로그램을 하나 만들고 프로젝트 이름을 “ShapeUser” 라고 하자. 물론 정상적인
컴파일이 되려면 Shapes.dll을 참조추가 해야 한다.
//명령줄에서는 csc /r:Shapes.dll shapeuser.cs 라고 컴파일 하면 된다.
namespace shapeuser
{
using
System;
using
Shapes;
public class
ShapeUser
{
public static
void Main()
{
Circle c = new
Circle(1.0F);
Console.WriteLine("Area of Circle(1.0) is {0}",
c.Area());
}
}
}
[결과]
3.14159265358979
전용 및 공유 어셈블리
지금까지는 전용 어셈블리 즉 하나의 단일한 응용 프로그램의 일부로서 배포되는 어셈블리에 대해 이야기를 했습니다. 이러한 어셈블리 이외에
닷넷은 여러 응용 프로그램들이 하나의 어셈블리를 동시에 공유하는 기능을 제공 합니다.
1. 전용 어셈블리
기본적으로 어셈블리는 해당 프로젝트 전용으로 쓰입니다. 전용 어셈블리는 반드시 해당 응용 프로그램과 동일한 디렉토리에 있어야 합니다.
Shapes.dll 역시 전용 입니다. 이 어셈블리를 ShapeUSer에서 참조하려면 두 프로젝트를 동일한 디렉토리에서 빌드 하거나
ShapeUSer에서 명시적으로 프로젝트 참조를 추가해야 합니다. 프로젝트 참조를 한 경우 VS는 shapes.dll의 복사본을 만들어
ShapeUser 디렉토리에 넣습니다. Shapes.dll이 복사되므로 원래의 shapes.dll이 사라져도 문제되지 않습니다. 그러나 많은
프로그램에서 참조되는 어셈블리의 경우 DLL을 매번 복사하는 것은 비 효율적 입니다. 이를 해결한 것이 공유 어셈블리 입니다
2. 공유 어셈블리
공유 어셈블리는 시스템 안의 모든 프로그램들이 공유 하는 어셈블리 입니다. 모든 공유 어셈블리는 전역 어셈블리 캐쉬(Global
Assembly Cache, GAC)라는 특별한 .NET 시스템 디렉토리에 저장 되므로 프로그램들은 공유 어셈블리의 위치를 알 필요가 없습니다.
공유 어셈블리들은 시스템 전반에서 사용되므로 .NET 런타임은 공유 어셈블리에 대한 보안이나 버전 호환성 면에서 좀 더 많은 점검을 수행
합니다.
공유 어셈블리 작성
강력한 이름(Strong Name)을 가진 공유 어셈블리를 만들려면 어셈블리의 서명에 사용할 공개/비공개키 쌍을 만들어야 합니다.
공개/비공개키 암호화 시스템은 암호화된 메시지를 보내는 사람만 알고 있는 비공개 키와 누구에게나 알려지는 공개키를 사용 합니다. .NET환경은
이러한 동일한 메커니즘을 이용해서 참조된 공유 어셈블리가 실제 그 어셈블리인지 점검을 하는 것 입니다. 어셈블리 이름, 버전, 공개키 조합은
반드시 고유 하며 이러한 조합을 강력한 이름 이라고 부릅니다.
.NET Framework은 이러한 강력한 이름을 만들어 내는 sn.exe(Strong Name)라는 도구를 제공 하는데 이 도구는
명령 프롬프트에서만 사용 가능 합니다.
sn의 사용법은 다음과 같습니다.
sn –k shapes.snk 이렇게 하면 현재 폴더에 shapes.snk라는 키 파일이 생 깁니다. 이 키로 어셈블리를 서명
하려면 프로젝트의 AssemblyInfo.cs 안의 끝 부분에 있는 AssemblyKeyFile 특성을 수정해야 합니다.
[assembly: AssemblyKeyFile("shapes.snk")]
아래 그림처럼 수정 해야 합니다.
<그림 AssemblyInfo.cs>
VS에서 키 파일의 위치는 기본적으로 프로젝트 디렉토리의 obj\debug 이며 만약 키 파일을 다른 곳에 두었다면 상대 경로를 적절히
이용하면 됩니다.
프로젝트를 정상적으로 빌드 하면 어셈블리에 서명이 추가 됩니다. 다시 ildasm으로 shapes.dll의 MANIFEST를 보면
서명이 추가되어 있는 것을 알 수 있습니다.
이 시점에서 ShapeUser.exe를 다시 컴파일 하지 않고 실행한다면 “어셈블리 참조가 일치 하지 않는다는 오류가 발생 합니다.”
이 경우 다시 컴파일 하게 되면 ShapeUser에서는 서명된 버전의 Shpaes.dll을 참조하게 됩니다. 아직까지 shapes.dll은 공유
어셈블리가 된 것은 아닙니다. 진정한 공유 어셈블리가 될려면 GAC에 넣어야 합니다. shapes.dll을 GAC 폴더에 끌어 놓으면
됩니다.
(명령 프롬프트에서는 등록시 gacutil /I shapes.dll, 삭제시 gacutil /u shapes)
실제로 shapes.dll이 캐시에 추가 되었는지를 확인 하기 위해 shapeuser.exe가 있는 곳에 shapes.dll을 삭제 후
shapeuser.exe를 실행 해 보자. (명령 프롬프트에서)
gacutil /u shapes 라고 입력한 후(shapes.dll을 해제 후) 다시 실행을 하면 실행이 되지 않을
것이다.
댓글 없음:
댓글 쓰기