2011-02-16 3 views
3

COM을 사용하여 C#에서 VBA로 MyClass [] 같은 사용자 지정 개체를 전달할 수 있습니까?COM Interop을 사용하여 C#에서 VBA로 개체 전달

그렇지 않은 경우이 방법을 사용하는 것이 가장 좋은 해결책입니까?

+1

검색 결과 http://stackoverflow.com/questions/375457/cant-instantiate-a-com-object-written-in-c-from-vba-vb6-ok가 도움이 될 수 있습니다. – Fionnuala

+1

당신이 ComVisible을 만든 한, 그렇습니다. –

답변

6

난 당신이 C#을 엑셀 VBA에 대해 얘기하고 가정 ...

여기 않는 최소한의 C# 클래스가 기본 이름으로 ClassLibrary1 w 프로젝트에서의

: 여기

using System; 
using System.Runtime.InteropServices; 

namespace Tester 
{ 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    public class TestClass 
    { 
     public double D { get; set; } // simple property to get, set a double 
     public string S { get; set; } // simple property to get, set a string 
    } 
} 

을하고 VBA가에의

Private Sub foo() 

Dim X As New ClassLibrary1.TestClass 

X.S = "Hello" 
Debug.Print X.S ' prints "hello" 

X.D = 12 
Debug.Print X.D ' prints a 12 

End Sub 

을 여기에 추가 일들이 작동하도록 할 필요가 있습니다 : 클래스를 시도

을 0
(1) in C# Project...Properties...Build ==> check "Register for COM interop 
(2) in C# Project...Properties...Application...Assembly Information ==> 
    check "Make assembly COM-visible" 
(3) in VBA ... Tools ... References, browse to the C# bin output directory and select the "*.tlb" file 

참고 :이 스키마는 클래스에 추가하는 것에 따라 실패 할 수 있습니다. VBA가 기본 생성자 이외의 정적 클래스 나 클래스를 "보지"않습니다. VB 컬렉션을 .NET 컬렉션에 매핑 할 수도 없지만 기본 유형 (double, long)과 기본 유형의 배열을 앞뒤로 전달할 수 있습니다. 또한 - "Autodual"옵션은 메소드를 노출시키기위한 저렴한 방법입니다. 시작하기는 쉽지만 효율성은 떨어지며 모든 공개 메소드를 노출합니다. 더 나은 연습 (하지만 더 많은 작업)은 자신의 인터페이스를 설정하는 것입니다. 이 TestClass의 멤버를 확장하여 정의한 다른 클래스의 인스턴스를 포함하고 AutoDual 또는 수동 코딩 인터페이스를 통해 클래스 메서드를 노출하는 경우 해당 클래스와 해당 메서드 (오버로드되지 않은 메서드)도 마찬가지로 표시됩니다 VBA (Intellisense 사용).

희망이 도움이됩니다.

+0

나는 C# 3.5, Visual Studio 2008의 클래스 라이브러리 프로젝트에서 그 예제를 시도했다. 나의 빌드는 dll, tlb만을 생성한다. 어떤 충고 ? – Jerome

관련 문제