문제

DotNet VSTO Excel Add-In Add-In Add-In Add-In Add-intle uptry를 사용자가 로컬 관리자가 아닌 경우 (예 : COM 등록, No COM 등록, httplistener가 없습니다)? VBA의 Microsoft 메시지 대기열을 사용할 수 있습니까?

도움이 되었습니까?

해결책

귀하의 질문을 "COM 등록없이 Excel에 .NET 어셈블리에 기능을 노출시키는 방법"으로 귀하의 질문을 광범위하게 해석 할 수 있다면 훌륭한 솔루션은 Excel의 XLL 인터페이스를 사용하는 것입니다. 기본적으로 하나는 xll shim과 관련 .net dll을 배포합니다. XLL이로드되면 DLL을 반사하고 그 안에 기능을 Excel에 노출시킵니다.

오픈 소스 구현은 여기에서 찾을 수 있습니다 http://exceldna.typepad.com/blog/2006/01/introducing_exc.html

상업, 폐쇄 소스이지만 여기에서 더 많은 기능이 풍부한 기능http://www.managedxll.com/

다른 팁

VSTO가 기본 응용 프로그램 도메인에서 실행되지 않으므로 COM 객체로 단순히 인스턴스화 할 수 없습니다.

여기에 내가 한 방법은 다음과 같습니다. 이것은 VSTO 통합 문서가 XLA 파일로 저장되었으며, 어떤면에서는 순수한 VSTO 추가 기능보다 유연합니다.

  • VBA 코드에서 참조 할 regasm.exe를 사용하여 유형 라이브러리를 생성해야합니다.

  • .NET 객체 모델에서 루트 팩토리 클래스를 만듭니다.이 모델은 VBA에서 소비하려는 클래스 (Office Object 모델의 "응용 프로그램"클래스와 같은)를 인스턴스화 할 수 있습니다.

  • 그런 다음이 공장 클래스의 인스턴스에 대한 참조를 VBA로 전달하는 방법을 찾아야합니다. VBA 가이 공장 클래스의 인스턴스를 참조하면 .NET 객체 모델의 다른 객체를 인스턴스화하는 방법을 호출 할 수 있습니다.

  • 인스턴스를 VBA로 전달하려면 다음과 같이 VBA 코드에서 매크로를 정의하십시오.

예제 코드 :

Private m_objMyFactory As Object

Public Sub RegisterFactory(MyFactory As Object)

    On Error GoTo ErrHandler
    Set m_objMyFactory = MyFactory
    Exit Sub
ErrHandler:
    MsgBox "An unexpected error occurred when registering the Factory component: " & Err.Description
    Exit Sub
End Sub
  • 이제 vsto thisworksbook_open 이벤트 핸들러에 코드를 추가하는데,이 이벤트 핸들러는 공장 객체를 인스턴스화하고 위의 매크로를 공장 객체에 대한 참조를 전달합니다.

예제 코드 :

void ThisWorkbook_Open()
{
     try
     {
         ThisApplication.Run("RegisterFactory",
             new MyNamespace.MyFactory(),
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing);
     }
     catch (Exception ex)
     {
         MessageBox.Show("Load error: " + ex.ToString());
     }
}

이 작업을 강력하게 고려해야 할 몇 가지 문제가 있습니다.

Excel4Net에 관심이있을 수 있습니다 (ExcelDNA 및 ManagedXll과 유사하지만 사용하기 쉽음) :

웹 사이트 :http://www.excel4net.com

블로그 :http://excel4net.blogspot.com

미래의 독자들을위한 참조를 위해 : 당신은 또한이 질문을 살펴볼 수도 있습니다.

VBA (Excel)에서 VSTO 애플리케이션 아드딘 유형 액세스

그리고 특히, 그곳에서 언급 된 블로그에 :

VSTO ADD-INS, COMADDINS 및 RequestComadDinaUtomationService

재정의로 requestComadDinaUtomationService () 모든 기능에 대한 진입 지점을 제공하는 Facade 클래스를 정의하고 해당 클래스를 VBA에 노출시켜 원하는 기능을 노출시킬 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top