Ik ben bezig met wat .Net interop. We hebben een native applicatie, en daarin draait een plugin geschreven in C#. Om de interfaces die de applicatie biedt accessible te maken voor C#, gebruik ik een C++/CLI project die de boel wrapt. Nou wil ik eigenlijk ook de originele pointer naar de native interface beschikbaar maken voor andere C++/CLI projecten, voor het geval ze iets willen doen wat nog niet gecovered wordt door de wrappers, maar dan stuit ik op een probleem - native types zijn standaard niet zichtbaar buiten de assembly, en members die dergelijke types in hun declaratie gebruiken worden dan ook private.
Voorbeeld:
Nu werkt dit op zich prima binnen dezelfde assembly, maar vanuit een andere assembly kun je ISomeManagedInterface::GetNative() dus niet aanroepen (C3767: 'ISomeManagedInterface::GetNative': candidate function(s) not accessible), aangezien ISomeNativeInterface een native type is die niet publiekelijk is, ookal weet de gebruikmakende assembly precies hoe die definitie eruit ziet (die includet dezelfde header).
Nou kan ik natuurlijk wel doodleuk void pointers gaan zitten doorgeven en handmatig gaan casten, maar daar word ik niet heel erg vrolijk van. Weet iemand een manier om een gedeelde native type toch publiekelijk accessible te maken, zonder de header aan te passen waarin dat type wordt gedefinieerd?
Voorbeeld:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
| // native interface, eigenlijk ergens gedefinieerd in een andere header class ISomeNativeInterface { public: virtual void Foo() = 0; }; // wrapper interface public interface ISomeManagedInterface { void Foo(); ISomeNativeInterface* GetNative(); }; |
Nu werkt dit op zich prima binnen dezelfde assembly, maar vanuit een andere assembly kun je ISomeManagedInterface::GetNative() dus niet aanroepen (C3767: 'ISomeManagedInterface::GetNative': candidate function(s) not accessible), aangezien ISomeNativeInterface een native type is die niet publiekelijk is, ookal weet de gebruikmakende assembly precies hoe die definitie eruit ziet (die includet dezelfde header).
Nou kan ik natuurlijk wel doodleuk void pointers gaan zitten doorgeven en handmatig gaan casten, maar daar word ik niet heel erg vrolijk van. Weet iemand een manier om een gedeelde native type toch publiekelijk accessible te maken, zonder de header aan te passen waarin dat type wordt gedefinieerd?
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.