2012-01-17 2 views
1

Excel에서 VBA에서 호출하는 COM 표시 C# 라이브러리를 사용하고 있습니다. 호출되는 C# 메서드에는 ref에서 전달 된 인수가 포함됩니다. VS2010, Office 2010, .NET Framework 4를 사용 중입니다.VBA/C# COM interop - 오류 430

  • 이전 버전의 Excel 파일에서는 라이브러리 호출이 정상적으로 작동하지만 여전히 작동합니다.

  • 최신 버전 (C# 라이브러리의 호출 자체는 변경되지 않음)에서 VBA는 라이브러리를 호출하지만 C# 메서드가 완료되면 런타임 오류 430 "클래스가 자동화를 지원하지 않습니다. 예상 인터페이스를 지원하지 않습니다 ". 나는 그것을보기 위해 DEBUG 모드를 사용했다. 동일한 파일에서 VBA는 배포 된 .NET 라이브러리를 호출합니다. - 다시 추가 VBA에서 OLE 자동화 라이브러리에 대한 참조를 을 : 나는 시도 무엇

. - C# 라이브러리 다시 컴파일

나는 무엇이 잘못 될 수 있는지에 대해 의아해합니다. 이전의 파일이 작동하기 때문에 Excel 자체가 문제가 아닌 것 같습니다. C# 라이브러리는 이전 파일에서도 호출되므로 문제는 라이브러리에서 가져 오지 않아야합니다. 내 파일이 COM 가시 라이브러리를 호출하는 능력에 관해서는, 다른 C# 라이브러리에 대한 호출이 작동합니다.

도움이 될 것입니다.

- 인터페이스

namespace Dispatch 
{ 
    public interface iCaller 
    { 
     string solveDispatch(int a, bool flag, float[] input, ref float[] output); 
    } 
} 

-Class

namespace Dispatch 
{ 
    [ClassInterface(ClassInterfaceType.None)] 
    [ComVisible(true)] 
    public class Caller : iCaller 
    { 
     public string solveDispatch(int a, bool flag, float[] input, ref float[] output) 
     {  
      //code 
      return "ok"; 
     } 
    } 
} 
:

Dim csharptoolsDispatch As Object 
Set csharptoolsDispatch = CreateObject("Dispatch.Caller") 
Dim a as string 
ReDim input(0 to 5) as single 
ReDim output(0 to 5) as single 
a = csharptoolsDispatch.solveDispatch(2, False, input, output) 

는 C#의 모습을 다음과 같이


CSHARP에 대한 VBA 호출입니다

Csharp 메서드 호출이 잘 작동합니다. Csharp는 정상적으로 실행되고 "반환"ok ","포커스 "가 VBA에 돌아 왔을 때 오류 430 메시지가 나타납니다.

+0

실패한 실제 라인을 게시 할 수 있습니까? 이 오류 메시지는 C# interop 또는 Excel에서 수행하도록 요청한 작업을 지원하지 않는 작업을 수행하려고한다고 말합니다. 그것은 이전 버전의 파일에서 작동하기 때문에 2003 snytax를 사용하여 무언가를하도록 Excel 2010에 요청하는 것 같습니다. 일부 코드를 보면 그것이 무엇인지 판단 할 수 있어야합니다. – Pynner

+0

요청에 따라 일부 코드를 게시했습니다. 두 파일 모두 Excel 파일을 사용합니다. – user1153715

답변

2

좋아, 나는 그것을 밖으로 정렬 관리.

뒤늦은 견해로는 꽤 명백한 실수 였지만 VBA와 C# 사이의 COM interop 인터페이스의 이상한 동작은 발견하기가 어려웠습니다.

인수 중 C#에 대한 VBA 호출에서 C#의 int 테이블로 정의 된 single 테이블이있었습니다. 그 주장은 심판에서 통과되었다.

그런 경우 VBA가 '잘못된 인수'또는 무언가를 말하기 위해 충돌 할 것으로 예상됩니다. 대신 C# 호출을 가능하게하는 int의 단일 캐스트가 암시 적으로 발생하는 것 같습니다. 그런 다음 csharp 메소드가 끝나면 VBA는 ref에서 전달한 인수와 그 유형을 변경 한 인수를 인식하지 못하는 것처럼 보입니다. 이로 인해 430 오류가 발생합니다.

내 이전 버전에는 실수가 없었기 때문에 작동했습니다.

나는 VBA를 가지고있다 매우 약하게 입력했습니다!

어쨌든, 수수께끼가 풀렸다!