Udostępnij za pośrednictwem


Calling C# code from C++ for Windows Phone apps and games

 

Calling C# code from C++ for Windows Phone apps and games

 

Often Windows Phone C++ developers get stuck when they need to call implemented C# functionalities in their C++ project. Especially, game developers working on Cocos2d-x and C++ need to call Facebook SDKs and In App Purchase (IAP) APIs which currently have only C# implementation for Windows Phone platform.

In this post, I am sharing steps to call C# code from C++ while building Windows Phone apps and games. C++/CX is not Managed C++, it’s a C++ component extension.

 

1. Create XAML and Direct3D apps for Windows Phone 8 for Cocos2d-x. Details: https://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207012(v=vs.105).aspx

 

2. Create a Windows Runtime component library.

 

3. Define a public interface class in a C++/CX header for the C# to implement (C++ to call) (e.g. ICallback).

 

4. Define a public ref class in a C++/CX header for the C++ to implement (C# to call) (e.g. CppCxClass).

 

5. Add a method in CppCxClass that passes and stores an ICallback. (A C++ global variable is shown for conciseness, you can use a better place to store this in your code-base).

 

ICallback^ globalCallback;

...

void CppCxClass::SetCallback(ICallback ^callback)

{

    globalCallback = callback;

}

 

6. Reference the WinRT library in your C# code.

 

7. C# code: create an instance of CppCxClass using var cppObject = new CppCxClass().

 

8. C# code: create a class which implements ICallback (e.g. CSharpCallbackObject).

 

9. C# code: pass an instance of CSharpCallbackObject down to C++. E.g. cppObject.SetCallback(new CSharpCallbackObject()).

 

You should now be able to call C# with globalCallback->CallCsharp(L"Hello C#");.  And you should be able to extend either ICallback and/or CppCxObject to do the rest of your tasks.

 

Code snippets:

C++/CX

//.h
[Windows::Foundation::Metadata::WebHostHidden]
public interface classICallback
{
public:
virtualvoidExec( Platform::String ^Command, Platform::String ^Param);
};
//.cpp
ICallback ^CSCallback = nullptr;
voidDirect3DInterop::SetCallback( ICallback ^Callback)
{
CSCallback = Callback;
}
//...

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

 

C# code

 

publicclassCallbackImpl : ICallback
{
publicvoidExec(StringCommand, StringParam)
{
//Execute some C# code, if you call UI stuff you will need to call this too
//Deployment.Current.Dispatcher.BeginInvoke(() => {
// //Lambda code
//}
}
}
//...
CallbackImpl CI = newCallbackImpl();
D3DComponent.SetCallback( CI);

 

 

Next, I will post on getting started with Cocos2d-x for Windows Phone and Windows Store games. Unity3D content will follow soon after Cocos2d-x

More on C++/CX https://msdn.microsoft.com/en-us/magazine/dn166929.aspx