在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)。
谢谢!
答案 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;
}