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'是不应该发生的?谁能帮我?
您可以添加经典 .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函数.谜团已揭开 :-)

编辑(2013-01-13)
此更改现在在MonoTouch的绑定Makefile中处理,即重新生成您的Cocos2d.dll程序集(同时执行make clean和make clean all删除托管代码和本机代码)将自动解决此问题.玩得开心!
| 归档时间: |
|
| 查看次数: |
495 次 |
| 最近记录: |