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

Posted

技术标签:

【中文标题】在 WP8 中从 C++ 代码调用 C# 方法【英文标题】:Calling C# method from C++ code in WP8 【发布时间】:2013-01-04 06:51:05 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

    创建一个 Windows 运行时组件库。 在 C++/CX 标头中定义 public interface class 以供 C# 实现(C++ 调用)(例如 ICallback)。 在 C++/CX 标头中定义 public ref class 以供 C++ 实现(C# 调用)(例如 CppCxClass)。

    CppCxClass 中添加一个传递并存储ICallback 的方法。 (为了简洁起见,显示了一个 C++ 全局变量,我建议您查看此内容,看看您是否可以找到更好的位置将其存储在您的代码库中)。

    ICallback^ globalCallback;
    ...
    void CppCxClass::SetCallback(ICallback ^callback)
    
        globalCallback = callback;
    
    

    在 C# 代码中引用 WinRT 库。

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

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

【讨论】:

太棒了!这几乎回答了我所有的问题!最后一点是,如果我可以像在 C# 中那样使用某种 Dispatcher,以便可以在主 UI 线程中调用这些回调。 找到了 Dispatcher 问题的解决方案:***.com/questions/10579027/… 非常感谢!我一直在寻找这种回调技术,但在其他任何地方都找不到它的正确描述 也许我是 C# 菜鸟,但 ICallback 需要的命名空间是什么? 此解决方案的完整实现+演练:developer.nokia.com/Community/Wiki/…【参考方案2】:

在费了很多力气想出所需的代码之后,我认为值得在这里发布最终版本

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);

【讨论】:

肯定是这样,因为像我这样的人会遇到同样的问题,而您为我节省了大量时间。谢谢。 如果能回答相关的SO问题就太好了@***.com/questions/23872394/…

以上是关于在 WP8 中从 C++ 代码调用 C# 方法的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中从循环中异步调用方法

在 Linux 中从 C++ 库调用 C++ 函数

C# 调用需要双精度数组和结构作为输入的 C++ DLL 函数

在 WebBrowser 的文档中从 JavaScript 调用 C# 代码

在 C++ 中从同一类中的另一个方法调用方法

在 Android JNI/NDK 代码中从 C++ 函数调用 C 函数