2010-12-21 40 views
1

在交流#装配我有一个全球性的棱镜CompositeCommand订阅这样的:使用订阅C#CompositeCommand从C++

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中使用函数签名。大多数情况下,我收到如下错误:

error C2664:'Microsoft :: Practices :: Prism :: Commands :: DelegateCommand :: DelegateCommand(System :: Action ^)':参数1从'void( 'System :: Action ^'中的__clrcall *)(MyNameSpace :: MyClass ^)'不可能。

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

谢谢!

+0

你们是不是在管理/ CLI C++或本地C处理命令++? – 2010-12-21 16:14:48

+0

哦,对不起,管理C++。没有cli,我甚至不会想这样做;) – Sam 2010-12-22 09:22:17

回答

2

我打算假设你正在使用托管C++ - 其他任何东西,还有更多需要担心的问题。

看起来你正在将错误链接到C#类型。因此,我不认为这个问题与棱镜有任何问题有关。为了使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; 
}