Please Enable JavaScript!
Gon[ Enable JavaScript ]

C# 에서 ActiveX Control 간단하게 만들어보기

기타 언어/C# & MFC
반응형

우리가  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 : 레지스트리에 등록한다.

 

 


반응형
Posted by 녹두장군1
,