If you code on windows phone with cocos2d-x maybe sometime you need to call method from C# like share link facebook, email, in-app purchase, ads,.... So that I write this tutorial to help someone who want to call C# method from C++. Now let do it!
- First you create
a new project and open wp8 project (I’m using cocos2d-x 3.4).
If you have error like this:
You need do add cocos2d namespace by : using cocos2d; anh then go BUILD -> Clean
Solution
Note: On cocos2d-x 3.3 and lower namespace PhoneDirect3DxamlAppComponent was changed to cocos2d.I’m using cocos 3.4 so I work on name space cocos2d, if you work on lower version name space is PhoneDirect3DxamlAppComponent.
- Open
HelloWorldScene.h we will do something in here:
You know, in cocos2d-x 3.4 C# and C++ use namespace cocos2d together and
we will do in this namespace.
Well, I will create an Interface class and a ref class like
this above class HelloWorld
namespace cocos2d { [Windows::Foundation::Metadata::WebHostHidden] public interface class ICallback { public: virtual void CallFunc(Platform::String ^mess); }; public ref class PlatformCenter sealed { public: PlatformCenter(void); static void setCallback(ICallback ^callback); static void callFunc(Platform::String^ s); }; };
Interface class ICallback will be used on C# and class
PlatformCenter will be used on C++ to call callFunc() from C#.
We need 2 static method:
static void setCallback(ICallback ^callback);
this
use to selCallback in C# like delegate.
static void callFunc(Platform::String^ s);
this use to call callFunc() from C++ with String input.
- Open
HelloWorldScene.cpp and we will code CallFunc method:
Add this code above HelloWorld class
namespace cocos2d { ICallback ^callBack = nullptr; PlatformCenter::PlatformCenter() { } void PlatformCenter::callFunc(Platform::String ^s) { callBack->CallFunc(s); } void PlatformCenter::setCallback(ICallback ^callback) { callBack = callback; } };
- Next we leave to
MainPage.xaml.cs on C#
On name space cocos2d (cocos2d-x 3.3 and lower
namespace PhoneDirect3DxamlAppComponent)
Create new class inherit PhoneApplicationPage class and ICallback interface. If it
doesn’t work, go to BUILD menu and Rebuild Solution
public class CSCallBack : PhoneApplicationPage, ICallback { public CSCallBack() { PlatformCenter.setCallback(this); } public void CallFunc(String s) { this.Dispatcher.BeginInvoke(() => { MessageBox.Show(s); //MessageBox will show string input from C++. }); } }
Then, go to MainPage class
create new instance of CSCallBack in MainPage Constructor
public MainPage() { InitializeComponent(); CSCallBack cs = new CSCallBack(); …... //some codes under }
define new void method in class HelloWorld (in
HelloWorldScene.h)
void CallCSharp();
next we code in this method:
void HelloWorld::CallCSharp() { std::string s ="Text from C++ -> Welcome REDzz - Crazyland"; std::wstring wstr; wstr.assign(s.begin(), s.end()); PlatformCenter::callFunc(ref new Platform::String(wstr.c_str())); }
In this method:
First we will create a string then convert it to wstring and then to Platform::String
Now run and enjoy winning ^^!.
Download Project on Github:
Well, maybe you need to read more infomation about:
[Windows::Foundation::Metadata::WebHostHidden]
ref class and structs
Platform::String
If you have problem when do this tutorial please leave a comment I will try my best to help you ^^. Finally, this post can have some mistake from me (like wrong typing, wrong grammar, ...) please tell me if you see it ^^ Thanks.
Hi there, i have a problem with this line
ReplyDeletePlatformCenter.setCallback(this);
An exception of type 'System.BadImageFormatException' occurred in PhoneDirect3DXamlAppInterop.DLL but was not handled in user code.
Can u help me?
Thanks you for comment :D
DeleteI found some solution for this problem, you can read here:
http://stackoverflow.com/questions/5229310/system-badimageformatexception-could-not-load-file-or-assembly
http://stackoverflow.com/questions/323140/system-badimageformatexception-could-not-load-file-or-assembly-from-installuti
I think it will help you solve problem :), if you have any problem please tell me :)