[C++/CLI] Native types public accessible maken in assembly

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:28

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
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:

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.


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Hier nog maar een keer dan? :P
aangezien ISomeNativeInterface een native type is die niet publiekelijk is
Ik zie hier het volgende:
C3767 may also be caused by a breaking change: native types are now private by default in a /clr compilation; see Type Visibility for more information.

[...]

The solution here is to add a #pragma make_public on the native type, after defining the native type but before defining the managed method that uses it. The docs for #pragma make_public imply you're supposed to get a compiler warning when a non-public native type is exposed by a public managed type, but (at least with the default warning levels) that does not seem to be the case.
Geen idee of dat werkt en voor jouw situatie opgaat. :)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:28

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Held :D
Waarom staat dat niet gewoon in de documentatie op die errorpagina 8)7

.edit: voor de duidelijkheid, dit is dus de oplossing
C++:
1
2
3
4
5
6
7
8
9
#include "ISomeNativeInterface.h"
#pragma make_public(ISomeNativeInterface)

// wrapper interface 
public interface ISomeManagedInterface 
{ 
    void Foo(); 
    ISomeNativeInterface* GetNative(); 
};

[ Voor 64% gewijzigd door .oisyn op 15-04-2011 10:28 ]

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.