从c ++订阅c#CompositeCommand

时间:2010-12-21 14:19:16

标签: c# c++ events prism

在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 ^)':从'void(__ clrcall *)(MyNameSpace :: MyClass ^)转换参数1 'in'System :: Action ^'不可能。

如何订阅c#命令?或者是否有其他方式来监听事件(我可以用不同的东西替换CompositeCommand)。

谢谢!

1 个答案:

答案 0 :(得分:2)

我将假设您正在使用托管C ++ - 其他任何事情,并且需要担心更大的问题。

看起来您正在将错误链接到C#类型。因此,我不认为这个问题与Prism的任何问题有关。为了使C ++托管编译器链接到您的C#程序集,您需要使用XML文档文件生成C#程序集(请参阅属性中的“构建”选项卡)。这是否在您的项目中启用了?

我使用以下内容作为一个非常简单的概念证明,其中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;
}