6

我绑定的 Objective C 库中有一些 C 风格的函数,我需要在我的应用程序中访问这些函数。是否可以以任何方式将这些添加到绑定中,以便我可以在我的 C# 应用程序中访问它们?

来自 Cocos2d 的示例:

void ccGLActiveTexture( GLenum textureEnum )
{
#if CC_ENABLE_GL_STATE_CACHE
    NSCAssert1( (textureEnum - GL_TEXTURE0) < kCCMaxActiveTexture, @"cocos2d ERROR: Increase kCCMaxActiveTexture to %d!", (textureEnum-GL_TEXTURE0) );
    if( (textureEnum - GL_TEXTURE0) != _ccCurrentActiveTexture ) {
        _ccCurrentActiveTexture = (textureEnum - GL_TEXTURE0);
        glActiveTexture( textureEnum );
    }
#else
    glActiveTexture( textureEnum );
#endif
}

编辑

链接到标题与我试图导入的功能:http: //www.cocos2d-iphone.org/api-ref/2.0.0/cc_g_l_state_cache_8h_source.html

我在我的 Extras.cs 中试过这个

public partial class CCGLProgram {
[DllImport("__Internal")]
    public static extern void ccGLUseProgram( uint program );

    public static void CCGLUseProgram(uint test)
    {
        ccGLUseProgram(test);
    }
}

不幸的是,我得到一个未找到入口点的错误。我想我的第一个想法可能是函数被破坏了,但我想既然'extern C'在那里不应该发生?谁能帮我?

4

2 回答 2

7

您可以为您需要的任何其他 C API 添加经典的.NET p/invokes , [DllImport]。它们可以很容易地添加到您的绑定程序集中,因为绑定是一个两步过程。

首先,您的 API 定义(接口)与额外的定义(例如enums)一起被编译到一个临时程序集中。

接下来,该程序集将用于生成代码(使用btouch):您将使用的绑定。在那个阶段可以包含更多代码,例如p/invokes,因此它们将成为您最终的、编译的、绑定程序集的一部分。

技巧:在 GIT 的monotouch-bindings中有很多可用的示例,只需 grepDllImport即可找到一些。

编辑 (2013-01-08)

Makefile 完成的Release构建(即使它只是调用xcodebuild)有问题,因为它在我libcocos2d.a在调试中重建时工作。例如

cd monotouch-bindings/cocos2d/binding
make debug

为了测试这一点,我将您的代码(有点简化)添加到现有的extra.cs

public partial class CCGLProgram {
    [DllImport ("__Internal", EntryPoint="ccGLUseProgram")]
    public static extern void UseProgram (uint program);
}

CCGLProgram.UseProgram (0);并从FinishedLaunchingJumpy 演示应用程序的方法中添加了对的调用。

编辑 (2013-01-12)

调试和发布版本非常相似(不足为奇)。调试版本有一些与调试相关的定义(同样不足为奇)。OTOH发布版本已经完成-fvisibility=hidden(我需要稍后验证)听起来像是这个问题的一个很好的候选者。

这确实是 Xcode 项目中的一个(非默认设置,参见最后一列)构建设置。将此设置更改为(通常是默认设置)将生成一个发布版本,您可以在其中使用正常 [DllImport](如上)调用 C 函数。谜团已揭开 :-)

Xcode 设置

编辑 (2013-01-13)

这个变化现在在 MonoTouch 的绑定 Makefile 中处理,即重新构建你的 Cocos2d.dll 程序集(同时执行make cleanmake clean all删除托管代码和本机代码)将自动解决这个问题。玩得开心!

于 2013-01-06T16:20:23.833 回答
0

只是一个疯狂的猜测,您提到它适用于调试但不适用于发布。这可能会发生,因为符号它被 mtouch “剥离”了。

为了测试这一点,请在实际引用您的绑定项目的项目上添加--nosymbolstrip到发布配置并试一试。

这确实对应用程序的最终大小有影响,但至少您会知道这是问题所在,我们可以制定解决方法,将发布有关它的博客文章。

请让我知道这是否适合您。

希望这可以帮助。

亚历克斯

于 2013-01-11T00:18:07.603 回答