2011-12-12 2 views
1

VBA의 이상한 동작을 이해하려고합니다. 인터페이스를 상속하고 COM에 노출 된 두 개의 .NET 클래스가 있습니다. 내가 COM interop에 등록하고 VBA에서 개체가 잘못된 인터페이스에서 유형을 표시하는 이상한 동작이 발생합니다. 그럼 아래 코드 설명 :.NET 형식이 VBA에서 잘못 노출됨

C# 클래스는 :

엑셀 VBA에서
namespace ComTest 
{ 
    [ComDefaultInterface(typeof(ITestClass))] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class TestClass : ITestClass 
    { 
     public string TestMethod() 
     { 
      return "Version 2-PROD Version"; 
     } 
    } 

    [ComDefaultInterface(typeof(ITestTrade))] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class TestTrade : ITestTrade 
    { 
     public string TradeName { get; set; } 
     public int QuantityNumber { get; set; } 
    } 
} 

: 나는 'ComTest'을 제거하고 단순히 클래스 이름을 사용하는 경우

Dim objTestClass As ComTest.TestClass 
Set objTestClass = New ComTest.TestClass 
Dim str As String 
objTestClass. ---> I GET ITestTrade methods in objTestClass 

Dim tTestTrade As ComTest.TestTrade 
Set tTestTrade = New ComTest.TestTrade 
tTestTrade. -----> I GET ITestClass methods in tTestTrade 

그러나,이 잘 작동합니다 . 즉,

Dim objTestClass As TestClass 
Set objTestClass = New TestClass 
Dim str As String 
objTestClass. ---> I GET ITestClass types 

Dim tTestTrade As TestTrade 
Set tTestTrade = New TestTrade 
tTestTrade. -----> I GET ITestTrade 

누군가 이해해 주시겠습니까?

+0

이것은 VBA 편집기의 버그 여야합니다. 해결 방법이 있습니다. –

+0

그렇게 생각하지 마십시오. 이 클래스는 다른 클래스 인터페이스에서도 나에게 일어나고 있기 때문에 복제하고 잘 찾은 것입니까? 나는 tlbs가 적절한 인터페이스 유형으로 생성되지 않을 것으로 의심합니다. –

+0

나는 최근에 같은 문제가 있었다. 등록 된 것이어야합니다. 나는 모든 guid (글자 그대로 모두) + guid를 어셈블리에서 변경해야했습니다. 얼마 후 문제는 다시 돌아 왔고 모든 guid를 다시 변경하면 도움이되었습니다. – xll

답변

1

왜 그런 일이 일어 났는지 정확한 이유를 찾지 못했습니다. 하지만 분명히 뭔가가 내 tlb 등록 및 COM에 노출 된 내 형식을 가지고있는 방식으로 잘못되었습니다. 조립을위한 조립 GUID 속성을 갖는

  • : 나는하여 중지 할 수 있었다

    : 비슷한 문제가 있다면이 사람을 위해 도움이 될 수 있습니다. (assemblyinfo.cs의)

  • 모든 클래스의 GUID 특성을 구체적으로 언급하고 인터페이스를 노출합니다.
  • 및 .NET 클래스

    [ComVisible(true)] 
    [ComDefaultInterface(typeof(IEvfExternalClient))] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class EvfExternalClient : IEvfExternalClient 
    { 
    } 
    
0

를 노출하기 위해 아래의 방법을 사용하여이 문제가 발생하는 경우, 확실히 당신이 위에서 언급 한 바와 같이 사용 [ComVisible(true)]를 사용하는 각 인터페이스 및 클래스의 고유 GUID를 생성, 다른 상황 (예 : Is there any purpose of ComDefaultInterface for a COM Callable Wrapper?)을 제외하고 [ComDefaultInterface(typeof(...))]을 사용하는 것은 불필요합니다.

[Guid(...)] 
[ComVisible(true)] 
public interface ITestClass 
{ 
    [DispId(1)] 
    string TestMethod(); 
} 

[Guid(...)] 
[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.None)] 
public class TestClass : ITestClass 
{ 
    public string TestMethod() 
    { 
     return "Version 2-PROD Version"; 
    } 
    public TestClass() : base() { } 
} 

이 의도하지 않은 행동을 방지 할 수 있습니다 :

다음은 올바른 구문입니다. 매개 변수없는 생성자가 필요하며 System.Object에서 명시 적으로 상속받을 수도 있습니다. https://msdn.microsoft.com/en-us/library/ms182203.aspx

응답이 올바르게 표시되었으므로 구문이 약간 변경되었습니다.

관련 문제