2011. 8. 10. 09:12

C# 클래스 라이브러리를 COM+에 등록해보겠습니다.

참고 : 마이크로 소프트 고객센터 - HOWTO: Visual C# .NET에서 서비스 대상 .NET 구성 요소 만들기

 

Com을 쓰던 Com+를 쓰던 어떻게 쓰는지는 자유이고 나같은 경우 클라이언트 프로그램에서 직접 DB에 접근하지 못하게 하려고 많이 씁니다.

웹참조도 비슷한 용도로 사용할수 있습니다.

 

웹의 경우 TCP/IP를 이용하여 따로 서버프로그램만들어 DB를 날려주는 프로그램을 만들어 쓰는 회사도 보았을 정도로 DB에 직접접근을 막는건 여러므로 좋습니다.

물론 저도 예전에는 멋모르고 그냥 서버프로그램 만들어 썼는데 Com+를 만나고나서는 Com+ 를 많이 이용하다가 요즘은 웹서비스를 많이 이용하고 있습니다.

따로 서버프로그램을 만드는거에 비해 얼마나 이득이 있는지는 모르겠지만 말이지만 덜귀찬은 건 맞습니다 ㅎㅎㅎ

 

물론 상황에 따라서는 웹참조가 더 효율적일수 있기 때문에 상황에 따라 골라쓸 필요가 있습니다.

여한트 알아두면 여러가지로 도움되는 내용이니 집고 넘어가 봅시다.

 

0. 참조 추가

.Net탭에서 System.EnterpriseServices를 찾아서 추가합니다.

 

 

1.AssemblyInfo.cs 편집

 

//Com+사용
using System.EnterpriseServices;

//ActivationOption 특성은 구성 요소가 호출자의 프로세스 내에서 활성화될 것인지 여부를 나타냅니다.
//Activation.Option 을 Library 나 Server로 설정 할 수 있습니다.
[assembly: ApplicationActivation(ActivationOption.Library)]
//ApplicationAccessControl 특성은 어셈블리어의 제어를 지정하는 것입니다.
[assembly: ApplicationAccessControl(true)]
//ApplicationName 특성은 COM+ 카달로그에 구성요소서비스 관리 콘솔에 나타나는 COM+ 응용 프로그램의 이름 입니다.
[assembly: ApplicationName("ClassLibrary1")]

 

 

2.Class1.cs

 

//Com+사용
using System.EnterpriseServices;

namespace ClassLibrary1
{
	public class Class1 : ServicedComponent
	{
		public string strCallTest()
		{
			return "Hello Com+";
		}

	}
}

 

 

3. 빌드

에러 없는지 확인 합니다.

 

 

4. COM+ 등록 작업

COM+를 등록하려면 강력한 이름이 필요합니다.

 

4-1.강력한 이름 만들기

VS2008명령 프롬프트 이용합니다.

'cd' 명령어를 이용하여 빌드된 DLL이 있는 곳으로 이동합니다.

(작업할때 핵갈리지 않게 하기 위해서 입니다..)

 

강력한 이름 생성

sn.exe -k [출력 이름].snk

예>
sn.exe -k ClassLibray1.snk

 

이렇게 생성한 ClassLibray1.snk 파일을 프로젝트에 등록합니다.

프로젝트 -> 속성 -> 서명 -> 어셈블리

 

 

4-2.COM+ 등록

 

Regsvcs ClassLibrary1.dll

 

 

문제 해결

설치하는 동안 알 수 없는 예외가 발생했습니다.

1 : System.Transactions.TransactionException - 트랜잭션 관리자를 사용할 수 없습니다. (예외가 발생한 HRESULT: 0x8004D01B)
2 : System.Runtime.InteropServices.COMException - 트랜잭션 관리자를 사용할 수 없습니다. (예외가 발생한 HRESULT: 0x8004D01B)

 

다음 글을 참고합니다.

참고 : COM+가 돌지 않는다!?

 

 

4-3. 확인

'구성 요소 서비스'로 들어가

구성 요소 서비스 > 컴퓨터 > 내 컴퓨터 > COM+ 응용 프로그램

에 위에서 만든 서비스가 등록 되었는지 확인합니다.

제가 만든 서비스가 등록되었습니다.

 

 

5. 실행

간단한 프로그램을 만들어 테스트하면 좋지만 MS의 가이드 라인에 따르면

 

1) 메모장에서 텍스트 파일을 엽니다.

2) 파일에 다음 코드를 붙여넣습니다.

set o =createobject("ServicedCOM.SimpleTrans")
MsgBox o.DoTrans()

3) 파일 메뉴에서 저장을 누릅니다.

4) 다른 이름으로 저장 대화 상자의 파일 이름 텍스트 상자에 Test.vbs를 입력합니다. 파일 형식 목록에서 모든 파일을 누른 다음 저장을 누릅니다.

5) 파일을 두 번 눌러 예제를 실행합니다.

 

그런데 위에서 만든 오브젝트명이랑 다르니

set o = createobject("ClassLibrary1.Class1")
MsgBox o.strCallTest()

이렇게 넣고 실행합니다.

 

완성된 파일은 다음과 같습니다.

Test.vbs
다운로드

 

createobject("ClassLibrary1.Class1") 에서

ClassLibrary1는 강력한 이름이고 Class1는 클래스 이름입니다.

 

제가 만든 예제에서는 네임스페이스와 강력한 이름을 같은 COM+응용프로그램이름까지 같은 이름으로 해놔서 저도 핵갈리니 잘못된거 있으면 덧글 부탁 드립니다.

 

 

마무리

하도 오래된 코드라 재대로 동작할지 모르겠습니다.

 

요즘은 COM계열은 쓰지 않기도 하고 말이죠 ㅎㅎㅎㅎ