是否可以将C引用添加到目标c绑定中?

AwD*_*ven 6 c c# binding objective-c xamarin.ios

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
}
Run Code Online (Sandbox Code Playgroud)

编辑

链接到我正在尝试导入的函数的标题: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);
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我得到一个入口点未找到错误.我想我的第一个想法可能是功能被破坏但是我认为,因为'extern C'是不应该发生的?谁能帮我?

pou*_*pou 7

您可以添加经典 .NET P /所调用,[DllImport]对任何额外的C API需要.它们可以被添加到你的绑定组件很容易因为这样做绑定是一个2个步骤的过程.

首先,将API定义(接口)以及额外定义(例如enums)编译到临时程序集中.

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

诀窍:GIT的monotouch-bindings中有很多样品可供选择,只需要一点点DllImport可以找到.

编辑(2013-01-08)

有一些错误的发行版本(即使它只是简单地调用xcodebuild)由Makefile执行,因为当我重建工程libcocos2d.a在调试.例如

cd monotouch-bindings/cocos2d/binding
make debug
Run Code Online (Sandbox Code Playgroud)

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

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

并在Jumpy演示应用程序CCGLProgram.UseProgram (0);FinishedLaunching方法内添加了一个调用.

编辑(2013-01-12)

调试和发布版本非常相似(不足为奇).在调试构建有几个调试相关的定义(同样不奇怪).OTOH 发布版本完成-fvisibility=hidden(我需要稍后验证)听起来像这个问题的一个很好的候选人.

它确实是Xcode项目中的(非默认,参见最后一列)构建设置.将此设置更改为No(通常是默认设置)将生成Release版本,您可以使用normal [DllImport](如上所述)来调用C函数.谜团已揭开 :-)

Xcode设置

编辑(2013-01-13)

更改现在在MonoTouch的绑定Makefile中处理,即重新生成您的Cocos2d.dll程序集(同时执行make cleanmake clean all删除托管代码和本机代码)将自动解决此问题.玩得开心!