2009-09-24 4 views
3

내 .net 코드에는 많은 수의 일반 속성이있는 객체가 있습니다. 이 개체는 VBA 코드로 반환됩니다. 모든 비 일반 속성이 잘 작동하지만 일반 값에 액세스해야합니다. VBA에서 할 수있는 방법이 있습니까?VBA의 .NET 일반 객체에 액세스

[ClassInterface(ClassInterfaceType.AutoDual)] 
public class Obj 
{ 
    public string GetProp1() {...} 
    public IList<MyCustomType> GetProp2() {...} 
} 

VB 코드 : 형식 라이브러리 내보내기 경고 처리 'NS.Obj :

Sub Test() 
    Dim o As Program.Obj 
    Set o = New Program.Obj 
    Set p2 = hp.GetProp2() 

    set p2_0 = p2(0) ' doesn't work 

End Sub 

답변

0

나는 반사를 통해 모든 것을 호출하는 못생긴 해킹을 설명하는 this article을 발견했습니다. 일반적인 값이 여전히 객체로 반환되기 때문에 리플렉션이 작동해야하지만 1) 느리고 2) 오류가 발생하기 쉽고 3) 매우 불편할 것입니다. 기사에서 보듯이

, 나는 다음과 같은 서명을 유틸리티 메소드를 사용합니다 :

public object GetProperty(object Instance, string Property) 
public object InvokeMethod(object Instance, string Method) 
public object InvokeMethod_OneParm(object Instance, string Method, object Parm1) 
public object InvokeMethod_TwoParms(object Instance, string Method, object Parm1, object Parm2) 
public void SetProperty(object Instance, string Property, object Value) 

이 미운하지만 가능한.

+0

@Matt Davis의 대답과 같이 경고가 표시됩니다. – Dude0001

4

VS 당신의 COM 등록을하고 있다면 당신은 (직접이 작업을 수행 할 수 없습니다, 당신은 같은 경고를 볼 수 있습니다. Get_GetProp2 (# 1), Assy '경고 : 형식 라이브러리 내보내기에서 서명에 제네릭 형식 인스턴스가 발생했습니다. 일반 코드를 COM으로 내보낼 수 없습니다.

약간 비선형 래퍼 및 COM에 노출되는 인터페이스 (강력한 형식의 객체를 원한다고 가정). VBA에서 형식 라이브러리를 참조하고 강력한 형식의 VBA 심판을 통해 개체에 액세스, 당신이 뭔가를 할 수 있습니다

(예를 들어, latebound) VBA에서 관리되는 형식 라이브러리를 참조하지 않고 작업이 얻는 데 트릭이있다
[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.AutoDual)] 
public class Class1 
{ 
    public IMyListOfString Strings {get; set;} 
    public Class1() 
    { 
     Strings = new MyListOfString() { "Foo", "Bar", "Baz" }; 
    } 
} 

[ComDefaultInterface(typeof(IMyListOfString))] 
public class MyListOfString : List<string>, IMyListOfString { } 

[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IMyListOfString 
{ 
    [DispId(0)] 
    string this[int idx] { get; set; } 
} 

, 너무 오래되었지만 COM 인터롭 세계에서 너무 길어 그것이 무엇인지 기억하지 못했습니다.