14

我有兴趣从 Windows Phone 8 中的 C++ 代码调用 C# 方法。我已经学会了如何通过我的 C++ 代码中的委托声明将回调函数从 C# 传递给 C++ 代码,但我正在寻找是否可以做到以下任何一项:

  • 直接从 C++ 代码调用某些方法。这将涉及以某种方式检查 C++ 中的 C# 对象构成,这对我来说似乎不太可能,但我想我还是会问你们所有人

  • 在 C# 代码中触发事件,然后可以由 C# 方法处理

  • 使用调度程序在主 UI 线程中调用 C# 回调,以便回调可以修改 UI 元素

  • 在C#代码中使用dispatcher来触发事件,(本质上是以上两点的合并)

简而言之,我正在寻找尽可能多的 C++ -->C# 通信技巧,你们可以扔给我,我想学习这一切。:)

4

2 回答 2

20

通过在 C# 代码中获取一个对象来实现 Windows RT 接口,并传递对该对象的引用,可以通过一些设置来完成上述所有操作(如果我理解正确 - 不确定到底是什么您想要处理您的 Dispatcher 示例 - 您可能希望将 Dispatcher 包装在 C# 端)。

  1. 创建 Windows 运行时组件库。
  2. 在 C++/CX 标头中定义 apublic interface class以供 C# 实现(C++ 调用)(例如ICallback)。
  3. 在 C++/CX 标头中定义 apublic ref class以供 C++ 实现(C# 调用)(例如CppCxClass)。
  4. 在其中添加一个CppCxClass传递并存储ICallback. (为了简洁起见,显示了一个 C++ 全局变量,我建议您查看此内容以查看是否可以找到更好的位置将其存储在您的代码库中)。

    ICallback^ globalCallback;
    ...
    void CppCxClass::SetCallback(ICallback ^callback)
    {
        globalCallback = callback;
    }
    
  5. 在 C# 代码中引用 WinRT 库。

  6. C# 代码:创建CppCxClassusing的实例var cppObject = new CppCxClass()
  7. C# 代码:创建一个实现ICallback(例如CSharpCallbackObject)的类。
  8. C# 代码:将 down 的实例传递CSharpCallbackObject给 C++。例如cppObject.SetCallback(new CSharpCallbackObject())

您现在可以使用globalCallback->CallCsharp(L"Hello C#");. 您应该能够扩展ICallback和/或CppCxObject完成其余任务。

于 2013-01-21T09:45:47.550 回答
16

在尝试找出所需的代码后,我认为值得在这里发布最终版本

C++/CX

//.h
[Windows::Foundation::Metadata::WebHostHidden]
public interface class ICallback
{
public:
    virtual void Exec( Platform::String ^Command, Platform::String ^Param);
};
//.cpp
ICallback ^CSCallback = nullptr;
void Direct3DInterop::SetCallback( ICallback ^Callback)
{
    CSCallback = Callback;
}
//...

if (CSCallback != nullptr)
    CSCallback->Exec( "Command", "Param" );

C#

public class CallbackImpl : ICallback
{
    public void Exec(String Command, String Param)
    {
        //Execute some C# code, if you call UI stuff you will need to call this too
        //Deployment.Current.Dispatcher.BeginInvoke(() => { 
        // //Lambda code
        //}
    }
}
//...
CallbackImpl CI = new CallbackImpl();
D3DComponent.SetCallback( CI);
于 2013-04-21T03:21:40.623 回答