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.