Windows phone 8 从C+调用C#方法+;WP8中的代码 我很感兴趣的是在Windows Phone 8中用C++代码调用C方法。我已经学会了如何通过C++代码中的委托声明将一个回调函数传递给C++代码,但是我想看看我是否可以做以下任何一项: < P>直接从C++代码调用某些方法。这将涉及到从C++中检查C对象的组成,我觉得不太可能,但我想我还是会问你们所有的问题< /p> 。
触发C#代码中的事件,然后可由C#方法处理Windows phone 8 从C+调用C#方法+;WP8中的代码 我很感兴趣的是在Windows Phone 8中用C++代码调用C方法。我已经学会了如何通过C++代码中的委托声明将一个回调函数传递给C++代码,但是我想看看我是否可以做以下任何一项: < P>直接从C++代码调用某些方法。这将涉及到从C++中检查C对象的组成,我觉得不太可能,但我想我还是会问你们所有的问题< /p> 。,windows-phone-8,c++-cx,Windows Phone 8,C++ Cx,触发C#代码中的事件,然后可由C#方法处理 使用调度程序在主UI线程中调用C#回调,以便回调可以修改UI元素 使用调度程序触发C代码中的事件(本质上是上述两点的合并) 简而言之,我在寻找很多C++和C语言的通信技巧,就像你们可以扔我一样,我想学习所有这些。p> 通过在C#代码中获取一个对象来实现Windows RT接口,并传递对该对象的引用,可以通过一点设置来完成上述所有操作(如果我理解正确-不确定如何使用Dispatcher示例-您可能希望在C#端包装Dispatcher) 创建Window
ICallback
)CppCxClass
中添加一个方法,该方法传递并存储ICallback
。(C++的全局变量显示为一致性,我建议您查看一下,看看是否可以找到更好的地方来存储代码库)。< /P>
var cppObject=new CppCxClass()
创建CppCxClass
的实例ICallback
(例如CSharpCallbackObject
)的类cppObject.SetCallback(新的CSharpCallbackObject())
您现在可以使用
globalCallback->CallCsharp(L“Hello C”)调用C代码>。您应该能够扩展ICallback
和/或CppCxObject
来完成其余的任务。在费尽周折试图找出所需代码之后,我认为值得在这里发布最终版本
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#
伟大的这几乎回答了我所有的问题!最后一点是,如果我可以像在C#中一样使用某种调度程序,以便在主UI线程中调用这些回调。找到了调度程序问题的解决方案:非常感谢!我一直在寻找这种回调技术,但在其他任何地方都找不到合适的描述。可能我是一个C#noob,但ICallback需要什么名称空间?这个解决方案的完整实现+演练:这肯定是,因为像我这样的人也会遇到同样的问题,你为我节省了大量时间。谢谢。如果你能回答相关的问题,那就太好了@
//.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" );
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);