подписка на c # CompositeCommand из c ++ - PullRequest
1 голос
/ 21 декабря 2010

В сборке c # у меня есть глобальная призма CompositeCommand, на которую можно подписаться следующим образом:

private static readonly CompositeCommand __myCommand = new CompositeCommand();

public static CompositeCommand MyCommand
{
  get { return _myCommand; }
}

Из c # я могу подписаться на эту команду, используя:

[...].MyCommand.RegisterCommand(new DelegateCommand<MyClass>((c) => c.Something()));

Моя проблема: мне нужно подписаться на команду из управляемого c ++, и я понятия не имел, как должна использоваться сигнатура функции в DelegateCommand. В большинстве случаев я получаю такие ошибки, как:

ошибка C2664: «Microsoft :: Practices :: Prism :: Commands :: DelegateCommand :: DelegateCommand (System :: Action ^)»: преобразование параметра 1 из «void (__clrcall *) (MyNameSpace :: MyClass ^) 'в' System :: Action ^ 'невозможно.

Как мне подписаться на команду c #? Или есть какой-то другой способ прослушать событие (я могу заменить CompositeCommand чем-то другим).

Спасибо!

1 Ответ

2 голосов
/ 21 декабря 2010

Я собираюсь предположить, что вы используете управляемый C ++ - что-нибудь еще, и есть большие проблемы, о которых нужно беспокоиться.

Похоже, вы получаете ссылки на ошибки вашего типа C #. Поэтому я не думаю, что проблема связана с какими-либо проблемами с Призмой. Чтобы управляемый компилятор C ++ связывался с вашей сборкой C #, вам необходимо создать сборку C # с файлом документации XML (см. Вкладку «Сборка» в ваших свойствах). Это включено в вашем проекте?

Я использовал следующее в качестве очень простого доказательства концепции, где TestObject определен в сборке C #, на которую ссылается DLL C ++. Это скомпилировано без каких-либо проблем.

Заголовочный файл:

 void __clrcall CommandCallback(Project::Infrastructure::TestObject^ param);

public ref class ManagedModule : IModule
{
public:
    ManagedModule();

     virtual void __clrcall Initialize();

private:
};

Реализация:

ManagedDLL::ManagedModule::ManagedModule()
{

}

void __clrcall ManagedDLL::ManagedModule::Initialize()
{
    Action<Project::Infrastructure::TestObject^>^ newAction = 
         gcnew Action<Project::Infrastructure::TestObject^>(&CommandCallback);
    DelegateCommand<Project::Infrastructure::TestObject^>^ newCommand = 
         gcnew DelegateCommand<Project::Infrastructure::TestObject^>(newAction);
    Project::Infrastructure::Commands::ApplicationExitCommand->RegisterCommand(newCommand);

    return;
}

void __clrcall CommandCallback(Project::Infrastructure::TestObject^ param)
{
    return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...