2010-01-07 4 views
3

COM interop을 사용하여 VBA 코드에서 C# 메서드를 호출 할 때 매개 변수의 제한은 무엇입니까?com interop을 사용하여 VBA에서 C# dll을 호출 할 때 형식이 일치하지 않습니다.

하나의 간단한 유형 (문자열, int 등)을 사용하는 메서드를 호출하면 작동하지만 사용자 정의 클래스를 매개 변수로 사용하는 메서드를 호출하면 오류가 발생합니다. '형식 불일치' VBA 코드를 컴파일하는 동안 오류가 발생했습니다.

C# 코드 :

public namespace foo { 
    public class XXX { } 

    public class Service { 
     public setString(String val) { ... } 
     public setXXX(XXX val) { ... } 
    } 
} 

VBA 코드 : service.setXXX (complexClass)

어떤 생각 : 위에서 언급 한 바와 같이

Dim service As New foo.Service 
service.setString("this works") 

Dim complexClass as New foo.XXX 

Rem This fails with a type mismatch error 
service.setXXX(complexClass) 

의 VBA 컴파일러는이 라인에 초크?

+0

죄송합니다. 답변을 게시하지 않았습니다. 오히려, 나는 제안을 가지고있다 : 당신이 COM-interop (COM 객체를 소비하는 COM-interop 또는 COM-Callable-Wrapper를 통해 .NET 객체에 액세스하는 COM 객체)를 심각하게 수행하려는 경우이 책을 구입하십시오. : http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X 해당 도서에 없으면 알 필요가 없습니다. – Yoopergeek

+0

XXX에서 인터페이스를 구현합니까? –

답변

1

void 또는 다른 데이터 형식을 반환하는지 여부를 나타내지 않으므로 setString 및 setXXX의 메서드 서명이 불완전합니다. 하는 setXXX 무효를 반환하면 등의로에 VBA의 메소드 호출에 매개 변수 (들)의 주위에 괄호를 제거하려고 :

service.setXXX complexClass 

설명 :

VBA에서는 하위 rotine의 인수를 둘러싸는 안 괄호 안의. 이는 두 개의 매개 변수를 가진 서브 루틴을 쉽게 생성하고 인자를 괄호 안에 싸서 호출하는 것을 쉽게 확인할 수 있습니다 :

//C# 
public void setXXX2(XXX val, XXX val2) { } 

. String 형의 경우 - 당신은 괄호 안에 당신의 단일 인수를 포장 할 때 위로 예제

'VB 
service.setXXX2 (complexClass, complexClass) 'Error 

는, 당신은 간단한 데이터 값을 평가하는 Parenthesized Expression을 만들었습니다.

당신이 볼 수있는 새로운 방법을 추가하여 자기를위한 그 - 나는 GetParameterType라고 - 클래스에 테스트 목적 :

public class Service { 
    public void setString(String val) { } 
    public void setXXX(XXX val) { } 
    public void setXXX2(XXX val, XXX val2) { } 

    public string GetParameterType(object val) { 
     return val.GetType().Name; 
    } 
} 

그런 다음 직접 변수를 전달하는 방법을 실행 한 다음 변수는 괄호 안에 .

MsgBox service.GetParameterType(complexClass) ' Returns XXX 
MsgBox service.GetParameterType((complexClass)) ' Returns String 
+0

+1 메소드 인자를 둘러싼 paranthesis를 추가하는 것은 올바르지 않습니다. 메소드 호출의 의미를 ByRef에서 ByVal 호출로 변경할 수도 있습니다 : http://stackoverflow.com/questions/1070863/hidden-features-of-vba/1070942# 1070942 –

+0

고마워, 정말 도움이됩니다. 비록 VB 코드에서 배열을 전달하면 GetParameterType 구현이 작동하지 않는 것 같아요. 그것은 COR_E_SAFEARRAYTYPEMISMATCH 함께 실패하고 있습니다. 개체 [] 걸리는 비슷한 메서드를 만들려고했는데 매개 변수는 동일한 결과를가집니다. houghts? – matt

관련 문제