从WP8中的C++代码调用C#方法

sta*_*oat 14 c++-cx windows-phone-8

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

  • 直接从C++代码调用某些方法.这将涉及以某种方式检查来自C++的C#对象化妆,对我来说似乎不太可能,但我想我无论如何都会问你们

  • 触发C#代码中的事件,然后可以通过C#方法处理

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

  • 使用调度程序触发C#代码中的事件,(基本上是上述两点的合并)

简而言之,我正在寻找尽可能多的C++ - > C#通信技巧,因为你们可以抛弃我,我想要全部学习.:)

Pau*_*tts 20

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

  1. 创建Windows运行时组件库.
  2. public interface class在C++中为C#定义一个C#实现(C++调用)(例如ICallback).
  3. public ref class在C++/CX头中定义一个C++来实现(C#来调用)(例如CppCxClass).
  4. 添加一个方法CppCxClass,传递并存储一个ICallback.(显示C++全局变量是为了保证,我建议您查看一下,看看是否可以在代码库中找到更好的存储位置).

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

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

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


Rel*_*mes 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" );
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

  • 这肯定是,因为像我这样的人带来同样的问题,你节省了我的时间.谢谢. (7认同)