VBA 또는 VBS에서 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
Reference
이 문제에 관하여(VBA 또는 VBS에서 COM을 통해 사용할 수있는 .NET 라이브러리를 만드는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mima_ita/items/efcd1a6ea86f09047984
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
Reference
이 문제에 관하여(VBA 또는 VBS에서 COM을 통해 사용할 수있는 .NET 라이브러리를 만드는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mima_ita/items/efcd1a6ea86f09047984
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
public interface INmcTagger
{
string GetModulePath();
void Create(NmcParam p);
NmcNode[] Parse(string text);
}
Dim ret As NmcNode()
ret = t.Parse("This is a pen.")
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);
}
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
Reference
이 문제에 관하여(VBA 또는 VBS에서 COM을 통해 사용할 수있는 .NET 라이브러리를 만드는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mima_ita/items/efcd1a6ea86f09047984텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)