【问题标题】:Make calls between C++ and C# code在 C++ 和 C# 代码之间进行调用
【发布时间】:2014-09-09 16:55:05
【问题描述】:

我正在将我的游戏移植到 Windows Phone 8。cocos2d-x 创建的 Visual Studio 项目有一个名为 MyGameComponent 的 C++ 项目,它是名为 MyGame。在 MyGame 中,cocos2d-x 为您提供了一个LocalizedStrings.cs 文件。我希望能够调用该文件,以便可以使用本机本地化系统。我该怎么做?

我也想将它用于其他功能,所以请不要建议其他方法来进行本地化。

我正在使用 cocos2d-x v2.2.5。

【问题讨论】:

  • 您使用的是原生 c++ 还是托管 c++?
  • 有什么区别?我猜是本地人。
  • 不同的是,在托管 c++ 中您可以调用 .Net,而在非托管(本机)中则不能。
  • 嗯,看来我是在托管 C++ 中。

标签: c# c++ windows-phone-8 cocos2d-x c++-cx


【解决方案1】:

您可以将委托从您的 C# 传递给 C++ 组件。

在您的 C++ 组件中,您将定义一个委托和一个设置该委托的方法调用,如下所示:

public delegate Platform::String^ GetTranslatedStringDelegate();

public ref class Component sealed
{
  public:
  void SetDelegate(GetTranslatedStringDelegate^);

  private:
  Platform::Agile<GetTranslatedStringDelegate> m_delegate;
}

然后在您的 C# 中,您可以创建一个与委托签名匹配的函数,并将其传递给您的组件:

public string GetTranslatedString()
{
   return "translated string";
}

// elsewhere in your C# code
component.SetDelegate(GetTranslatedString);

然后在您的 C++ 中,您可以在需要获取已翻译字符串时调用委托方法。

编辑:我写了一篇关于这个主题的博客文章 - http://robwirving.com/2014/07/21/calling-c-methods-c-winrt-components/

【讨论】:

  • 谢谢,我现在试试。
  • 祝你好运 :) 如果有帮助,请记得标记为已回答。
  • 好的,成功了!现在我的问题是,如何让 C# 代码和 C++ 代码使用相同的组件?目前我已经把它做成了单例,但这不是最好的代码设计。
  • 您可以在 C# 中新建它并将 ptr 作为成员变量挂起,并在 C++ 中将“this”分配给来自 c'tor 的全局 ref ptr。不确定这是否是最佳做法,但它对我有用。
  • 太费劲了。它有效,并且考虑到没有什么严重的依赖于这种设计,我会减少损失。非常感谢!!!
【解决方案2】:

如果您使用的是托管 c++,那么您只需将您的 C# dll 作为参考添加到您的 C++ 项目中。 然后像往常一样调用你的 C# Dll。

ManagedCSharp::ManagedClass::ShowValue();

其中 ManagedCSharp 是命名空间,ManagedClass 是类,ShowValue 是方法。

【讨论】:

  • 这不会导致周期性参考吗? C# 代码在 MyGame 中,而我需要在 MyGameComponent 中进行调用,这是 MyGame 的依赖项目。
  • 所以将 MyGameComponent 添加到您的 C++ 中!
  • MyGameComponent C++ 项目。
  • @robwirving 不要拒绝我的回答,因为提问者指定他正在使用托管。
  • @GuyKogus 如果 Rob 认为 Windows8 不使用托管 c++ 是正确的,那么您尝试做的事情是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 2011-03-09
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多