I'm interested in calling a C# method from C++ code in Windows Phone 8. I have already learned how to pass a callback function to C++ code from C# via delegate declarations in my C++ code, but I am looking to see if I can do any of the following:
Call certain methods directly from the C++ code. This would involve somehow inspecting the C# object makeup from C++, and seems unlikely to me, but I thought I'd ask you all anyway
Trigger events in the C# code, which can then be handled by C# methods
Use a dispatcher to call C# callbacks in the Main UI thread so that the callbacks can modify UI elements
Use a dispatcher to trigger events in the C# code, (Essentially a merging of the above two points)
In short, I am looking for as many C++ -->C# communication tips as you guys can throw me, I want to learn it all. :)
By getting an object in C# code to implement a Windows RT interface, and passing down a reference to this object, it is possible to do all of the above with a bit of set-up (if I understand correctly - not sure about exactly what you want to do with your Dispatcher examples - you might want to wrap the Dispatcher on the C# side).
- Create a Windows Runtime component library.
- Define a
public interface class
in a C++/CX header for the C# to implement (C++ to call) (e.g.ICallback
). - Define a
public ref class
in a C++/CX header for the C++ to implement (C# to call) (e.g.CppCxClass
). Add a method in
CppCxClass
that passes and stores anICallback
. (A C++ global variable is shown for consiseness, I recommend you review this to see if you can find a better place to store this in your code-base).ICallback^ globalCallback; ... void CppCxClass::SetCallback(ICallback ^callback) { globalCallback = callback; }
Reference the WinRT library in your C# code.
- C# code: create an instance of
CppCxClass
usingvar cppObject = new CppCxClass()
. - C# code: create a class which implements
ICallback
(e.g.CSharpCallbackObject
). - C# code: pass an instance of
CSharpCallbackObject
down to C++. E.g.cppObject.SetCallback(new CSharpCallbackObject())
.
You can now call C# with globalCallback->CallCsharp(L"Hello C#");
. You should be able to extend either ICallback
and/or CppCxObject
to do the rest of your tasks.
After a lot of headaches trying to figure out the required code, I think it's worth posting the final version here
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);
来源:https://stackoverflow.com/questions/14434874/calling-c-sharp-method-from-c-code-in-wp8