Вызов метода С# из кода С++ в WP8 - программирование
Подтвердить что ты не робот

Вызов метода С# из кода С++ в WP8

Мне интересно вызвать метод С# из кода на С++ в Windows Phone 8. Я уже узнал, как передать функцию обратного вызова на С++-код из С# через объявления делегата в моем коде на С++, но я смотрю, Я могу выполнить любое из следующих действий:

  • Вызовите определенные методы непосредственно из кода на С++. Это должно было бы каким-то образом проверить объект С# объекта с С++, и мне кажется маловероятным, но я думал, что все равно спрошу вас.

  • Триггерные события в коде С#, которые затем могут обрабатываться с помощью методов С#

  • Используйте диспетчер для вызова обратных вызовов С# в потоке основного интерфейса, чтобы обратные вызовы могли изменять элементы пользовательского интерфейса

  • Используйте диспетчер для запуска событий в коде С# (по существу, слияние двух указанных выше точек)

Короче говоря, я ищу столько советов по С++ → С#, как вы, ребята, можете меня бросить, я хочу узнать все это.:)

4b9b3361

Ответ 1

Получив объект в коде С# для реализации интерфейса Windows RT и передавая ссылку на этот объект, можно сделать все вышеперечисленное с некоторой настройкой (если я правильно понимаю - не уверен о том, что вы хотите делать с примерами Dispatcher - вы можете обернуть Диспетчер со стороны С#).

  • Создайте библиотеку компонентов Windows Runtime.
  • Определите public interface class в заголовке С++/CX для С# для реализации (С++ для вызова) (например, ICallback).
  • Определите public ref class в заголовке С++/CX для реализации С++ (С# для вызова) (например, CppCxClass).
  • Добавьте метод CppCxClass, который передает и сохраняет ICallback. (Глобальная переменная С++ показана для удобства, я рекомендую вам просмотреть это, чтобы узнать, сможете ли вы найти лучшее место для хранения этого кода в базе кода).

    ICallback^ globalCallback;
    ...
    void CppCxClass::SetCallback(ICallback ^callback)
    {
        globalCallback = callback;
    }
    
  • Ссылка на библиотеку WinRT в коде С#.

  • Код С#: создайте экземпляр CppCxClass с помощью var cppObject = new CppCxClass().
  • Код С#: создайте класс, который реализует ICallback (например, CSharpCallbackObject).
  • Код С#: передать экземпляр CSharpCallbackObject до С++. Например. cppObject.SetCallback(new CSharpCallbackObject()).

Теперь вы можете вызвать С# с помощью globalCallback->CallCsharp(L"Hello C#");. Вы должны расширить возможности ICallback и/или CppCxObject для выполнения остальных задач.

Ответ 2

После многих головных болей, пытающихся выяснить требуемый код, я думаю, что стоит опубликовать окончательную версию здесь

С++/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" );

С#

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);