C# 클래스 라이브러리를 COM+에 등록해보겠습니다.
참고 : 마이크로 소프트 고객센터 - HOWTO: Visual C# .NET에서 서비스 대상 .NET 구성 요소 만들기
Com을 쓰던 Com+를 쓰던 어떻게 쓰는지는 자유이고 나같은 경우 클라이언트 프로그램에서 직접 DB에 접근하지 못하게 하려고 많이 씁니다.
웹참조도 비슷한 용도로 사용할수 있습니다.
웹의 경우 TCP/IP를 이용하여 따로 서버프로그램만들어 DB를 날려주는 프로그램을 만들어 쓰는 회사도 보았을 정도로 DB에 직접접근을 막는건 여러므로 좋습니다.
물론 저도 예전에는 멋모르고 그냥 서버프로그램 만들어 썼는데 Com+를 만나고나서는 Com+ 를 많이 이용하다가 요즘은 웹서비스를 많이 이용하고 있습니다.
따로 서버프로그램을 만드는거에 비해 얼마나 이득이 있는지는 모르겠지만 말이지만 덜귀찬은 건 맞습니다 ㅎㅎㅎ
물론 상황에 따라서는 웹참조가 더 효율적일수 있기 때문에 상황에 따라 골라쓸 필요가 있습니다.
여한트 알아두면 여러가지로 도움되는 내용이니 집고 넘어가 봅시다.
.Net탭에서 System.EnterpriseServices를 찾아서 추가합니다.
//Com+사용
using System.EnterpriseServices;
//ActivationOption 특성은 구성 요소가 호출자의 프로세스 내에서 활성화될 것인지 여부를 나타냅니다.
//Activation.Option 을 Library 나 Server로 설정 할 수 있습니다.
[assembly: ApplicationActivation(ActivationOption.Library)]
//ApplicationAccessControl 특성은 어셈블리어의 제어를 지정하는 것입니다.
[assembly: ApplicationAccessControl(true)]
//ApplicationName 특성은 COM+ 카달로그에 구성요소서비스 관리 콘솔에 나타나는 COM+ 응용 프로그램의 이름 입니다.
[assembly: ApplicationName("ClassLibrary1")]
//Com+사용
using System.EnterpriseServices;
namespace ClassLibrary1
{
public class Class1 : ServicedComponent
{
public string strCallTest()
{
return "Hello Com+";
}
}
}
에러 없는지 확인 합니다.
COM+를 등록하려면 강력한 이름이 필요합니다.
VS2008명령 프롬프트 이용합니다.
'cd' 명령어를 이용하여 빌드된 DLL이 있는 곳으로 이동합니다.
(작업할때 핵갈리지 않게 하기 위해서 입니다..)
강력한 이름 생성
sn.exe -k [출력 이름].snk
예>
sn.exe -k ClassLibray1.snk
이렇게 생성한 ClassLibray1.snk 파일을 프로젝트에 등록합니다.
프로젝트 -> 속성 -> 서명 -> 어셈블리
Regsvcs ClassLibrary1.dll
설치하는 동안 알 수 없는 예외가 발생했습니다.
1 : System.Transactions.TransactionException - 트랜잭션 관리자를 사용할 수 없습니다. (예외가 발생한 HRESULT: 0x8004D01B)
2 : System.Runtime.InteropServices.COMException - 트랜잭션 관리자를 사용할 수 없습니다. (예외가 발생한 HRESULT: 0x8004D01B)
다음 글을 참고합니다.
참고 : COM+가 돌지 않는다!?
'구성 요소 서비스'로 들어가
구성 요소 서비스 > 컴퓨터 > 내 컴퓨터 > COM+ 응용 프로그램
에 위에서 만든 서비스가 등록 되었는지 확인합니다.
간단한 프로그램을 만들어 테스트하면 좋지만 MS의 가이드 라인에 따르면
1) 메모장에서 텍스트 파일을 엽니다.
2) 파일에 다음 코드를 붙여넣습니다.
set o =createobject("ServicedCOM.SimpleTrans")
MsgBox o.DoTrans()
3) 파일 메뉴에서 저장을 누릅니다.
4) 다른 이름으로 저장 대화 상자의 파일 이름 텍스트 상자에 Test.vbs를 입력합니다. 파일 형식 목록에서 모든 파일을 누른 다음 저장을 누릅니다.
5) 파일을 두 번 눌러 예제를 실행합니다.
그런데 위에서 만든 오브젝트명이랑 다르니
set o = createobject("ClassLibrary1.Class1")
MsgBox o.strCallTest()
이렇게 넣고 실행합니다.
완성된 파일은 다음과 같습니다.
createobject("ClassLibrary1.Class1") 에서
ClassLibrary1는 강력한 이름이고 Class1는 클래스 이름입니다.
제가 만든 예제에서는 네임스페이스와 강력한 이름을 같은 COM+응용프로그램이름까지 같은 이름으로 해놔서 저도 핵갈리니 잘못된거 있으면 덧글 부탁 드립니다.
하도 오래된 코드라 재대로 동작할지 모르겠습니다.
요즘은 COM계열은 쓰지 않기도 하고 말이죠 ㅎㅎㅎㅎ