2011-08-15 2 views
0

Je travaille avec une base de code C++ 6.0 héritée qui ne peut pas être convertie en .NET. Ce que j'essaye de faire est d'écrire toutes les nouvelles fonctionnalités dans C# envelopper ceci avec un wrapper COM et appeler cela à partir de C++. Je suis tombé sur un tas d'articles d'appel C++ de C# mais très peu dans l'autre sens. L'interaction entre C# et C++ fonctionne bien pour moi pour les types simples, mais j'ai rencontré un problème, je dois passer un tableau de type Variable (défini par l'utilisateur) de C++ à C#, quand j'importe la bibliothèque de types. ligne suivante pour toute méthode que je déclare un tableau en C#Passer un tableau de structure de C++ à C#

méthode

« ParseEquation » non émis en raison du type de retour non valide ou type de paramètre

quelqu'un peut-il me dire comment je peux passer un tableau d'une classe définie par l'utilisateur de C++ à C# Code voici le code.

C# code

// Equation Parser 


//Events Interface 
[ComVisible(true), Guid("47C976E0-C208-4740-AC42-41212D3C34F0"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
public interface IEquation_EventsCOM 
{ 
} 

//COM Interface 
[ComVisible(true), Guid("3F2DE348-0BDA-4051-92B5-9B7A59FD525D")] 
public interface IEquationCOM 
{ 
    [DispId(0)] 
    string GetParserInfo(); 

    [DispId(1)] 
    float ParseEquation(IVariableCOM[] varList, string expression); 
} 

[ComVisible(true), Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IEquation_EventsCOM))] 
public class Equation : IEquationCOM 
{ 
    public Equation() 
    { 
    } 

    [ComVisible(true)] 
    public string GetParserInfo()//List<Variable> varList, string expression) 
    { 
     Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 
     string name = System.Reflection.Assembly.GetExecutingAssembly().GetName().FullName; 
     return "Assemby Name: " + name + " Version: " + version.ToString(); 
    } 

    [ComVisible(true)] 
    public float ParseEquation(IVariableCOM[] varList, string expression) 
    { 
     //test return value 
     return 12.0000f; 
    } 
} 


// Equation Parser Helper Classes 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
public struct IVariableCOM 
{ 
    public string Name; 
    public string Type; 
    public float Value; 
} 

tête généré en C++ par l'importation bibliothèque de types

// Machine generated IDispatch wrapper class(es) created with ClassWizard 
///////////////////////////////////////////////////////////////////////////// 
// IEquation_EventsCOM wrapper class 

class IEquation_EventsCOM : public COleDispatchDriver 
{ 
public: 
    IEquation_EventsCOM() {}  // Calls COleDispatchDriver default  constructor 
    IEquation_EventsCOM(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {} 
    IEquation_EventsCOM(const IEquation_EventsCOM& dispatchSrc) :  COleDispatchDriver(dispatchSrc) {} 

// Attributes 
public: 

// Operations 
public: 
}; 
///////////////////////////////////////////////////////////////////////////// 
// IEquationCOM wrapper class 

class IEquationCOM : public COleDispatchDriver 
{ 
public: 
    IEquationCOM() {}  // Calls COleDispatchDriver default constructor 
    IEquationCOM(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {} 
    IEquationCOM(const IEquationCOM& dispatchSrc) : COleDispatchDriver(dispatchSrc) {} 

// Attributes 
public: 

// Operations 
public: 
    CString GetGetParserInfo(); 
    // method 'ParseEquation' not emitted because of invalid return type or parameter  type 
}; 

Répondre

0

Vous importez la bibliothèque à utiliser via l'interface IDispatch. Cela vous permet d'exposer uniquement les objets primitifs (int, string, fload, arrays, etc) et autres (qui doivent également implémenter IDispatch).

Vous devriez donc remplacer le Struct (struct IVariableCOM) par une nouvelle interface IDispatch + définition d'implémentation (similaire à IEquationCOM/Equation).

Une solution de bas niveau (vous devriez connaître les règles COM: gestion de la mémoire, etc): Si vous utilisez les objets COM uniquement depuis C++, vous pouvez extraire le fichier idl et le compiler sur votre projet C++ où vous peut accéder à la définition IVariableCOM.

Questions connexes