C # bellen vanuit C ++, problemen met "." in C # naamruimte

Ten eerste, ik geef toe dat ik dit een beetje in de vrachtauto gebruik - mijn mooie, schone voorbeeldcode werkt niet als ik hem in de echte wereld stop. Dat gezegd hebbende...

Ik heb een DLL genaamd CPierce.CSharpCall.dll met daarin iets van de volgende C #:

namespace CPierce.CSharpBridge
{
    [System.Runtime.InteropServices.Guid("3D08DF02-EFBA-4A65-AD84-B08ADEADBEEF")]
    public interface ICSide
    {
       //interface definition omitted...
    }
    [System.Runtime.InteropServices.Guid("CBC04D81-398B-4B03-A3D1-C6D5DEADBEEF")]
    public partial class CSide : ICSide
    {
       //class definition omitted...
    }
}

Dit is geregistreerd met regasm/tlb , enz. Dan ziet mijn C ++ -code er ongeveer zo uit:

#import "CPierce.CSharpCall.tlb" named_guids

   //Contains syntax errors!
int myfunc()
{
    HRESULT hRes = S_OK;
    CoInitialize(NULL);
    CPierce.CSharpBridge::ICSide *pManagedInterface = NULL;

    hRes = CoCreateInstance(
            CPierce.CSharpBridge::CLSID_Class1, 
            NULL, CLSCTX_INPROC_SERVER, 
            CPierce.CSharpBridge::ICSide, 
            reinterpret_cast (&pManagedInterface));

   //Calls to the interface omitted....

    CoUninitialize();
    return 0;
}

Het probleem is natuurlijk het syntactisch verkeerde stukje over CPierce.CSharpBridge . Ik weet in C ++ of ik een vergelijkbare naamruimte wil hebben voor de C# -code die ik zou kunnen zeggen:

namespace CPierce
{
    namespace CSharpBridge
    {
       //definitions go here
    }
}

Maar ik denk niet dat ik hier naar zoek, omdat ik alleen naar twee constanten moet verwijzen die zich in een andere naamruimte bevinden zonder de hele methode in die naamruimte te zetten.

Wat is de C ++ syntaxis die ik nodig heb om deze aanroep te voltooien naar CoCreateInstance ?


Update: bij diepere (veel diepere) inspectie, merk ik dat mijn .tlb-bestand gemaakt door regasm bijna leeg is. Toen ik al mijn bronnen samenvoegde in één .cs-bestand en compileerde met:

csc /debug /t:library BigFile.cs 
regasm BigFile.dll /tlb:BigFile.tlb

Ik krijg een flink (en handig) bestand tlb.

Wanneer ik het hele project compileer vanuit Visual Studio, krijg ik een .DLL goed, maar regasm doet er niets mee, maar produceert een minimaal .tlb-bestand. (ildasm toont bijna geen verschillen tussen de twee DLL's)

Als ik BigFile.cs compileer in Visual Studio, krijg ik een DLL die ook nutteloos is.

Ik heb geen idee.

1
Werkt het als u niet een geneste naamruimte heeft?
toegevoegd de auteur Gabe, de bron
Ja. Iets raars echter ... Als ik op de .tlb in de objectbrowser klik, wordt dit weergegeven als CPierce_CSharpBridge. Nu komt CPierce_CSharpBridge :: ICSide terug als "ICSide is geen lid van PR1_CSharpBridge". Niet opgelost, maar toch anders.
toegevoegd de auteur Clinton Pierce, de bron
Mijn problemen kunnen iets dieper zijn, het .tlb-bestand bevat bijna niets - ik weet niet zeker of mijn typen/interfaces volledig worden geregistreerd. regasm geeft geen fouten, maar ik krijg er geen bruikbare .tlb van. Ik heb een standaard constructor ... tijd om dichter naar regasm te kijken.
toegevoegd de auteur Clinton Pierce, de bron
Heb je geprobeerd :: te gebruiken in plaats van . ?
toegevoegd de auteur Random832, de bron
Voor mij "." werd vervangen door "_" bij het genereren van de tlb met regasm. Het eenvoudig openen van het bestand tlb met Visual Studio toonde het probleem.
toegevoegd de auteur uli78, de bron

2 antwoord

C ++ gebruikt de operator . niet om naamruimten te scheiden; het gebruikt :: . U gebruikt CPierce :: CSharpBridge in plaats van CPierce.CSharpBridge . Helaas lijkt dat u niet te helpen, omdat u niet weet welke naamruimte daadwerkelijk door de TLB wordt gegenereerd.

Een eenvoudige oplossing hiervoor is om helemaal geen namespaces te gebruiken en zonder deze te importeren:

#import "CPierce.CSharpCall.tlb" named_guids no_namespace
3
toegevoegd
@clintp: CPierce :: CSharpBridge :: ICSide .
toegevoegd de auteur R. Martinho Fernandes, de bron
@ clintp: gaat het goed met het negeren van de naamruimten?
toegevoegd de auteur Gabe, de bron
Actaully, het veranderen van het gebruik van CPierce.CSharpBridge :: ICSide geeft me de fouten CPierce is geen klasse- of naamruimtenaam. Sorry, ik heb dat ook geprobeerd.
toegevoegd de auteur Clinton Pierce, de bron
Ja, sorry, dat is wat ik wilde typen. Alle dikke punten, nog steeds een fout.
toegevoegd de auteur Clinton Pierce, de bron
@clintp - Update je vraag en post wat je momenteel gebruikt en de exacte compileerfout die je ontvangt. Ik neem aan dat het dll zich op een locatie bevindt en dat u er op de juiste manier naar linkt, u lijkt niet zoveel hulp nodig te hebben.
toegevoegd de auteur Security Hound, de bron

Dit lijkt een probleem te zijn aan de kant van C #/Visual Studio. Ik zal deze vraag verlaten en een geschikte openen. Bedankt voor je hulp bij het verfijnen.

0
toegevoegd