2016-03-23 31 views
7

Si verificano problemi nell'utilizzo di un public enum definito in C# all'interno di un'interfaccia C++. Il progetto .NET è esposto a COM per essere utilizzato all'interno del software legacy C++ e VB.C# Enum in una libreria C++

C# Codice:

namespace ACME.XXX.XXX.XXX.Interfaces.Object 
{ 
    [Guid(".....")] 
    [InterfaceType(ComInterfaceType.InterfaceIsDual)] 
    [ComVisible(true)] 
    public interface TestInterface 
    { 
     void Stub(); 
    } 

    [ComVisible(true)] 
    public enum TestEnum 
    { 
     a = 1, 
     b = 2 
    } 
} 

C++ Codice:

Edit: Nel IDL per il progetto ho importato il TLB. (importlib("\..\ACME.XXX.XXX.XXX.Interfaces.tlb"))

interface ITestObject : IDispatch 
{ 
    [id(1), helpstring("one")] 
    HRESULT MethodOne([in] TestInterface *a); 

    [id(2), helpstring("two")]  
    HRESULT MethodTwo([in] TestEnum a); 
} 

In MethodTwo, continuo a ricevere errori affermando

Tipo Eccetto Specification vicino TestEnum

Sto assumendo che c'è qualcosa che non sto facendo correttamente. MethodOne sembra trovare il riferimento correttamente.

C'è un po 'di magia nel fare riferimento all'oggetto enum .NET nell'interfaccia C++?

risposta

2

Le enumerazioni sono piuttosto eccentriche, la libreria di tipi che si ottiene dal progetto C# non ha un typedef per TestEnum. È possibile scrivere in questo modo invece:

[id(2), helpstring("two")]  
    HRESULT MethodTwo([in] enum TestEnum a); 

Annotare l'aggiunta enum parola chiave. Oppure si può dichiarare il proprio typedef se si utilizza l'identificatore in più luoghi o bisogno nel vostro codice C++, metterlo prima della dichiarazione di interfaccia:

typedef enum TestEnum TestEnum; 

probabilmente si preferisce quest'ultimo.

+0

Grazie Hans. Ha funzionato perfettamente! –