VBA 또는 VBS에서 COM을 통해 사용할 수있는 .NET 라이브러리를 만드는 방법

11443 단어 VBAVBScript.NET
이 문서에서는 VBA나 VBScript로부터 COM 경유로 .NET의 처리를 실행하는 방법에 대해 기술한다.

환경



・Visual Studio2008 Pro
· .NET Framework 2.0을 대상으로 한다.
· 32비트 Office2010

.NET을 사용하여 클래스 모듈을 COM으로 만드는 방법



1. 관리자 권한으로 Visual Studio 2008을 시작합니다.
  이것은 COM 등록시에 레지스트리를 변경하기 위해서.

2. 프로젝트 추가에서 .NET Framework 2.0 및 클래스 라이브러리를 선택합니다.


3. 빌드에서 플랫폼의 타겟을 「x86」또는 「x64」로 한다.
이것은 사용하는 Excel에 맞춘다.



4. 빌드에서 COM 상호 운용 기능의 등록을 체크한다.


5. 응용 프로그램의 어셈블리 정보에서 "어셈블리를 COM 참조 가능하게 만들기"


6. 공개하고 싶은 인터페이스와 그 실태에 대해 다음과 같이 기술한다
using System.Runtime.InteropServices;
namespace NMeCabCom
{
    [ComVisible(true)]
    public interface INmcTagger
    {
        void Create();
        NmcNode[] Parse(string text);
    }

    [ClassInterface(ClassInterfaceType.None)]
    public class NmcTagger : INmcTagger
    {
        private MeCabTagger nmcab;
        public NmcTagger()
        {
        }

        public void Create()
        {
            MeCabParam p = new MeCabParam();
            p.DicDir = @"C:\dev\NMeCab\dic\ipadic";

            this.nmcab = MeCabTagger.Create(p);
        }

        public NmcNode[] Parse(string text)
        {
            List<NmcNode> result = new List<NmcNode>();
            if (this.nmcab == null)
            {
                return result.ToArray();
            }
            MeCabNode node = this.nmcab.ParseToNode(text);
            while (node != null)
            {
                result.Add(new NmcNode(node));
                node = node.Next;
            }
            return result.ToArray();
        }

    }
}

우선, 공개하는 인터페이스의 직전에 「ComVisible(true)」라고 기술한다.
    [ComVisible(true)]
    public interface INmcTagger
    {
        void Create();
        NmcNode[] Parse(string text);
    }

그리고, 그 인터페이스의 실장 부분은 ClassInterfaceType.None으로 한다.
    [ClassInterface(ClassInterfaceType.None)]
    public class NmcTagger : INmcTagger

7. 빌드를 함으로써 COM 등록까지 이루어진다

인터페이스 설계 시 주의해야 할 사항.



・List<>등의 제네릭형은 COM로서는 공개할 수 없다

· ClassInterfaceType에 AutoDual을 기술하면, 인터페이스 불필요하게 할 수는 없으면 안된다
htp : // msd 응. 미 c 로소 ft. 코 m / 쟈 jp / ぃ b 등 ry / ms182205. 아 spx

· Uint, ULONG 등의 Unsigned 형을 인터페이스에 사용하면 안된다
COM으로서는 사용할 수 있어도, VBA나 VBS는 Unsigned를 서포트하고 있지 않기 때문에, ULONG등의 인터페이스는 사용할 수 없다.

· 객체의 배열은 반환하지 않아야합니다.

다음과 같은 COM 인터페이스가 있다고 가정합니다.
    public interface INmcTagger
    {
        string GetModulePath();
        void Create(NmcParam p);
        NmcNode[] Parse(string text);
    }

이 인터페이스의 경우, VBA나 C#등의 형태를 명시할 수 있는 프로그래밍 언어로는 적절히 처리할 수 있다
Dim ret As NmcNode()
ret = t.Parse("This is a pen.")

그러나 VBS의 경우 형식을 명시할 수 없기 때문에 Unknown이 되어 처리할 수 없게 된다.
Dim ret ' As NmcNode()
ret = t.Parse("This is a pen.")
WScript.Echo TypeName(ret) ' Unknownとなり、以降処理できない。

이러한 경우는 배열을 관리하는 인터페이스를 작성해, 그것을 경유하도록(듯이) 한다.
    public interface INmcNodeCollection
    {
        int Count { get; }
        NmcNode GetItem(int index);
    }

배열이 아닌 객체를 반환하면 VBS에서도 처리 할 수 ​​있습니다.
set ret = t.Parse("This is a pen.")
For i = 0 To ret.Count- 1
  WScript.Echo TypeName(ret.GetItem(i))
  WScript.Echo ret.GetItem(i).Surface
Next

이용방법



개발 환경 이외의 등록 방법



.NET Framework 폴더에 있는 regasm을 사용합니다.
작성한 dll에/tlb 및/codebase를 부여하여 regasm을 실행한다.
regasm은 각 버전의 .NET에 존재합니다.
SET BIN=C:\Windows\Microsoft.NET\Framework\v2.0.50727

REM 登録
%BIN%\regasm  C:\dev\NMeCabCom\NMeCabCom\bin\Debug\NMeCabCom.dll /tlb /codebase

이 때 다음 메시지가 출력 될 수 있습니다.
「RegAsm : warning RA0000 : 署名されていないアセンブリを /codebase を使用して登録すると、同じコンピュータにインストールされるその他のアプリケーションとの競合が生じる可能性があります。/codebase スイッチは署名されたアセンブリのみに使用できます。アセンブリに厳密な名前を付けて、再登録してください。」

이것은 경고뿐이며 COM 등록이되었습니다.
이 경고를 지우려면 프로젝트 설정에서 "서명"→ "어셈블리 서명"엄격한 이름의 키 파일을 선택해야합니다.



의존하는 모든 DLL에는 똑같은 정확한 이름이 있어야 하기 때문에 주의하십시오.

COM 삭제 방법



/tlb 및/unregister를 부여한 regasm 명령을 실행한 후 파일을 지우면 된다.
regasm /tlb C:\dev\NMeCabCom\NMeCabCom\bin\Debug\NMeCabCom.dll  /unregister

ExcelVBA에서 사용하는 방법



참조를 설정하면 사용할 수 있습니다.


이하와 같이 인텔리센스가 효과가 있다.


VBS에서 사용하는 방법



다음과 같이 CreateObject를 이용한다.
set t = CreateObject("NMeCabCom.NmcTagger")

실제 샘플



VBA 또는 VBScript로 형태소 분석을 수행하는 방법
ぃ tp // 이 m / 미마 _ 있거나 / ms / bc2 굳 b060 네 12d280d7b

좋은 웹페이지 즐겨찾기