우리가 ActiveX 를 사용하는 이유는 Desktop Application 과 동일한 함수, 이벤트
Properties 를 Web Application 에서 사용하기 위함이다.
Web Application 개발자들은 클라이언트에서 좀더 고급기능의 함수를 제공하고
싶어한다. 그것은 printing Streams, socket programming, cross domain 등등 이있다.
아래 소스에서 Asignatures 라는 interface 를 정의할것이다.
클래스는 method 와 properties 로 구성되어있다. 이것은 Web Browser 에서
자바스크립트를 통해 호출될 함수이다.
모든 interface 멤버는 기본적으로 abstract 나 public 이다.
구현한 ActiveX Class 인 Aclass 는 이 interface 클래스를 상속받아서 구현을 한다.
구현된 ActiveX Class 에 ClassInterfaceType.AutoDual 옵션을 적용했는데
이것은 COM 에서 볼수있도록 자동으로 공개되는 형식이다.
using System;
using System.Runtime.InteropServices;
namespace ANamespace
{
public interface ASignatures
{
string FName();
string SName();
int Age { get;}
}
[ClassInterface(ClassInterfaceType.AutoDual)]
public class AClass : ASignatures
{
public string FName()
{
return "Imran";
}
public string SName()
{
return "Nathani";
}
public int Age
{
get { return 24; }
}
}
}
이제 위의 소스를 컴파일 해야한다. ActiveX 이므로 라이브러리를 만드어야 되는데
csc.exe 를 이용해서 컴파일한다.
이 프로그램은 보통 \WINDOWS\Microsoft.NET\Framework\v2.0.xxxxx 위치하며
소스를 이곳에 넣고 dos command 창을 띄운후 csc /t:library ACass.cs 입력한다.
이제 생성된 dll 을 client register 에 등록을 해야한다.
assembly 를 등록할수 있는 방법은 여러가지인데 setup file 이나 브라우저에서 바로
설치할수 있도록 self extractor file 로 만들수 있다.
그러나 이 제는 command prompt 에서 regasm 프로그램을 이용해 등록할 것이다.
명령문은 다음과 같다.
regasm AClass.dll /tlb /codebase
Html 파일을 만들어 등록한 ActiveX 로 접근해서 사용해보자.
<html>
<head>
<script language="javascript">
<!-- Load the ActiveX object -->
var x = new ActiveXObject("ANamespace.AClass");
<!-- Access the Method -->
alert(x.FName());
alert(x.SName());
<!-- Access the Property -->
alert(x.Age);
</script>
</head>
<body>
</body>
</html>
하지만 위의 소스에 문제가 있는데 AutoDual 을 사용하지 않도록 권고하고 있다.
Auto 레이아웃 형식은 공용 언어 런타임에 의해 관리된다.
이들 형식의 레이아웃은 .NET Framework 버전 간에 변경될수 있으므로 특정 레이아웃이
필요한 COM 클라이언트에서는 문제가 발생할수 있다. StructLayoutAttribute 특성을 지정하지
않으면 C#, Visual Basic 및 C++ 컴파일러에서 값 형식에 대하 Sequential 레이아웃으로
지정해버린다. 이규칙 위반 문제를 해결하려면 ClassInterfaceAttribute 특성의 값을
None 으로 변경하고 인터페이스를 명시적으로정의한다.
위와 같은 내용으로 소스를 수정하면 다음과 같다.
using System;
using System.Runtime.InteropServices;
namespace ANamespace
{
public interface ASignatures
{
string FName();
string SName();
int Age { get;}
}
[ClassInterface(ClassInterfaceType.AutoDual)]
public class AClass : ASignatures
{
public string FName()
{
return "Imran";
}
public string SName()
{
return "Nathani";
}
public int Age
{
get { return 24; }
}
}
public interface IExplicitInterface
{
string FName();
string SName();
int Age { get; }
}
[ClassInterface(ClassInterfaceType.None)]
public class BClass : IExplicitInterface
{
public string FName()
{
return "Imran";
}
public string SName()
{
return "Nathani";
}
public int Age
{
get { return 24; }
}
}
}
그리고 RegAsm.exe 로 레지스트리에 dll 을 추가하게 되는데 자주 쓰이는 두가지 옵션만
알면된다.
/unregister : 레지스트리에서 해제한다.
/codebase : 레지스트리에 등록한다.
'기타 언어 > C# & MFC' 카테고리의 다른 글
에러 - The type or namespace name 'DllImport' could not be found (0) | 2009.06.29 |
---|---|
C# 파일검색 간단한 예제 (1) | 2009.04.18 |
탐색기에 나와있는 간단한 TreeView, ListView 구현예제 (0) | 2009.04.14 |
탐색기에 나와있는 간단한 TreeView 구현예제 (0) | 2009.04.12 |
C# 에서의 Thread class (0) | 2009.03.21 |
DB 검색 데이타 양이 많아 메인 화면이 멈추는걸 막고 독립적인 Thread 로 돌리고 싶을때 (2) | 2009.03.21 |
List 나 Grid 등에 대량의 데이터를 업로드 할 때 화면멈춤 해결하기 (0) | 2009.03.19 |
C# 에서 Thread Safe 의 2가지 사용법 (0) | 2009.03.19 |