Marshal C ++ Structuur als referentie in C #

Ik probeer deze struct te dupliceren van C ++ naar C #:

        typedef struct
        {
            int id;
            char *name;
        } *ListOfObjects;

Ik heb geprobeerd dit te gebruiken, maar het importeert niet correct in de app die dit DLL-bestand gebruikt en op zoek is naar een specifieke handtekening.

  [StructLayout(LayoutKind.Sequential), Serializable]
  public struct ListOfObjects {
       [MarshalAsAttribute(UnmanagedType.ByValArray)]
       public int id;

       [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 15)]
       public string name;
  }

  [DllExport("ReadListOfObjects", CallingConvention = CallingConvention.Cdecl)]
  static ListOfObjects ReadListOfObjects()
  {
      ListOfObjects lists = new ListOfObjects();
      return lists;
  }

Nadat ik het DLL-bestand heb gecompileerd en vervolgens probeer het programma te starten dat deze functies importeert, wordt deze fout weergegeven:

  The prodedure entry point ReadListOfObjects could not be located in the dynamic link library thedll.dll.

Om het even welke ideeën?

2
De attributen van de MarshalAs zijn schromelijk verkeerd. Maar je bent er nog niet zo dichtbij, het kan de functie nog niet vinden. U toont alleen de struct, niet de C-verklaring van de ReadListOfObjects() -functie. We kunnen er niet naar raden.
toegevoegd de auteur Hans Passant, de bron

1 antwoord

Probeer dit:

[StructLayout(LayoutKind.Sequential), Serializable]
public struct ListOfObjects
{
    public int id;

    [MarshalAs(UnmanagedType.LPStr)]
    public string name;
}
2
toegevoegd
Dezelfde fout als eerder. Ik zal de vraag bijwerken met hoe ik de interface definieer die deze gegevensstructuur gebruikt.
toegevoegd de auteur Dave, de bron
Eigenlijk is dat mijn echte code. Ik gebruik dit: sites.google.com/site/robertgiesecke/Home/ uploads/& hellip;
toegevoegd de auteur Dave, de bron
@Dave: die fout heeft niets te maken met ListOfObjects , het heeft te maken met de manier waarop TI_ReadListOfLists wordt gedeclareerd in uw niet-beheerde code (heeft waarschijnlijk een C-koppeling nodig en heeft een C ++ -link) . Toon ons uw niet-beheerde functie. (Ook is DllExport duidelijk onzinnig - toon uw echte code, geen slechte benadering ervan.)
toegevoegd de auteur ildjarn, de bron
@Dave: dat is voor het exporteren van beheerde methoden als native functies. Als dat eigenlijk uw bedoeling is, dan is uw vraag vaag (zoals het lijkt dat u het omgekeerde wilt) en moet u dat vermelden evenals de externe bibliotheek waaraan u gekoppeld bent.
toegevoegd de auteur ildjarn, de bron