2013-01-21 11 views
14

Jestem zainteresowany wywołaniem metody C# z kodu C++ w Windows Phone 8. Nauczyłem się już przekazywać funkcję wywołania zwrotnego do kodu C++ z C# za pośrednictwem deklaracji delegatów w moim kodzie C++ , ale szukam, czy mogę wykonać jedną z następujących czynności:Wywołanie metody C# z kodu C++ w pakiecie WP8

  • Zadzwoń do niektórych metod bezpośrednio z kodu C++. To wiązałoby się jakoś kontroli makijaż C# obiektu z C++, i wydaje się mało prawdopodobne, aby mnie, ale myślałem, że ci zadać wszystkie Anyway

  • wydarzenia spust kodu C#, które następnie mogą być obsługiwane przez C# metod

  • Użyj dyspozytora zadzwonić C# wywołania zwrotne w wątku Main UI tak, że wywołania zwrotne mogą modyfikować elementy interfejsu

  • użyć dyspozytorowi wyzwalać zdarzenia w kodzie C#, (zasadniczo scalenie dwóch powyższych punktów)

W skrócie, szukam tylu wskazówek komunikacyjnych C++ -> C#, jak wy możecie mnie rzucić, chcę się nauczyć wszystkiego. :)

Odpowiedz

20

Uzyskanie obiektu w kodzie C# do implementacji interfejsu Windows RT i przekazanie odnośnika do tego obiektu, możliwe jest wykonanie wszystkich powyższych przy odrobinie konfiguracji (jeśli dobrze rozumiem - nie wiesz dokładnie, co chcesz zrobić z przykładami Dispatchera - możesz chcieć owinąć Dispatchera po stronie C#).

  1. Utwórz bibliotekę komponentów środowiska wykonawczego Windows.
  2. Zdefiniuj public interface class w nagłówku C++/CX dla C# do implementacji (C++ na wywołanie) (np. ICallback).
  3. Zdefiniuj public ref class w nagłówku C++/CX dla C++ na implementacji (C# na wywołanie) (np. CppCxClass).
  4. Dodaj metodę w CppCxClass, która przekazuje i przechowuje ICallback. (Zmienna globalna C++ jest pokazana dla zachowania spójności, polecam ją przejrzeć, aby sprawdzić, czy można znaleźć lepsze miejsce do przechowywania tego w bazie kodu).

    ICallback^ globalCallback; 
    ... 
    void CppCxClass::SetCallback(ICallback ^callback) 
    { 
        globalCallback = callback; 
    } 
    
  5. referencyjny biblioteka WinRT w kod C#.

  6. Kod C#: utwórz wystąpienie CppCxClass, używając var cppObject = new CppCxClass().
  7. Kod C#: utwórz klasę, która implementuje ICallback (np. CSharpCallbackObject).
  8. Kod C#: przekazuje instancję CSharpCallbackObject do C++. Na przykład. cppObject.SetCallback(new CSharpCallbackObject()).

Możesz teraz zadzwonić do C# z numerem globalCallback->CallCsharp(L"Hello C#");. Powinieneś być w stanie przedłużyć albo ICallback i/lub CppCxObject, aby wykonać pozostałe zadania.

+0

Great! To odpowiada prawie na wszystkie moje pytania! Ostatni bit byłby, gdybym mógł używać jakiegoś Dispatchera, tak jak ja w C#, aby te wywołania zwrotne mogły być wywoływane wewnątrz głównego wątku UI. – staticfloat

+0

Znaleziono rozwiązanie dla pytań Dispatchera: http://stackoverflow.com/questions/10579027/run-code-on-ui-thread-in-winrt – staticfloat

+0

Wielkie dzięki! Szukałem tego rodzaju techniki oddzwaniania i nie mogłem go znaleźć nigdzie indziej poprawnie. –

16

Po wielu bólach głowy próbując zorientować się żądany kod, myślę, że warto delegowania tutaj ostateczną wersję

C++/CX

//.h 
[Windows::Foundation::Metadata::WebHostHidden] 
public interface class ICallback 
{ 
public: 
    virtual void Exec(Platform::String ^Command, Platform::String ^Param); 
}; 
//.cpp 
ICallback ^CSCallback = nullptr; 
void Direct3DInterop::SetCallback(ICallback ^Callback) 
{ 
    CSCallback = Callback; 
} 
//... 

if (CSCallback != nullptr) 
    CSCallback->Exec("Command", "Param"); 

C#

public class CallbackImpl : ICallback 
{ 
    public void Exec(String Command, String Param) 
    { 
     //Execute some C# code, if you call UI stuff you will need to call this too 
     //Deployment.Current.Dispatcher.BeginInvoke(() => { 
     // //Lambda code 
     //} 
    } 
} 
//... 
CallbackImpl CI = new CallbackImpl(); 
D3DComponent.SetCallback(CI); 
+7

Zdecydowanie tak, bo wtedy facet taki jak ja przychodzi z tym samym problemem i oszczędzasz mi mnóstwo czasu. Dziękuję Ci. – Nico

+0

Byłoby świetnie, gdybyś mógł odpowiedzieć na powiązane pytanie SO @ http://stackoverflow.com/questions/23872394/calling-c-sharp-function-from-win-rt-library – Curious