gpt4 book ai didi

c# - 从 C++ 订阅 C# CompositeCommand

转载 作者:行者123 更新时间:2023-11-30 04:36:32 27 4
gpt4 key购买 nike

在 c# 程序集中,我有一个全局 prism 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 ' 在 'System::Action ^' 中不可能。

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

谢谢!

最佳答案

我假设您使用的是托管 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;
}

关于c# - 从 C++ 订阅 C# CompositeCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4500218/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com