Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以将C引用添加到目标C绑定?_C#_Objective C_C_Binding_Xamarin.ios - Fatal编程技术网

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

C# 是否可以将C引用添加到目标C绑定?,c#,objective-c,c,binding,xamarin.ios,C#,Objective C,C,Binding,Xamarin.ios,在我绑定到的目标C库中有一些C风格的函数,我需要在应用程序中访问这些函数。是否可以以任何方式将它们添加到绑定中,以便我可以在C#应用程序中访问它们 Cocos2d中的示例: void ccGLActiveTexture( GLenum textureEnum ) { #if CC_ENABLE_GL_STATE_CACHE NSCAssert1( (textureEnum - GL_TEXTURE0) < kCCMaxActiveTexture, @"cocos2d ERROR:

在我绑定到的目标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
}
不幸的是,我得到了一个入口点未找到的错误。我想我的第一个想法可能是函数被破坏了,但我想既然“外部C”在那里,那就不应该发生了?有人能帮我吗?

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

首先,将API定义(接口)连同额外定义(例如,
enum
)编译到临时程序集中

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

诀窍:GIT中有很多可用的示例,只要搜索一下
DllImport
,你就会找到一些

编辑(2013-01-08)

由Makefile完成的发布版构建(即使它只是调用
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)的调用从Jumpy demo应用程序的
FinishedLaunching
方法内部

编辑(2013-01-12)

调试版本和发布版本非常相似(不足为奇)。debug构建有一些与调试相关的定义(同样也不足为奇)。o发布版的构建是通过
-fvisibility=hidden
完成的,这听起来是解决这个问题的一个很好的选择

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

编辑(2013-01-13)


这在MonoTouch的bindings Makefile中处理,即重新封装Cocos2d.dll程序集(执行
make clean
make clean all
以删除托管代码和本机代码)将自动解决此问题。玩得开心

只是一个猜测,您提到它在调试时工作,但在发布时不工作。这可能是因为符号被mtouch“剥离”了

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

这确实会对应用程序的最终大小产生影响,但至少你会知道这是个问题,我们可以找到一个解决办法,威尔将在博客上发表相关文章

请让我知道这是否适合你

希望这有帮助


亚历克斯像什么?展示一个“目标C中的C风格函数”的示例。你是指GLenum类型还是函数本身?你是否尝试将代码编译为DLL,并将任何你想从C调用的函数作为DLL中的导出?我不明白你的确切问题。如果你只想调用C++中的C函数,你必须编译它为DLL,从C语言中导出并调用导出函数。但是,它没有包含我需要的所有函数,因此我一直在添加到ApiDefinition中。对我来说,添加目标C类/函数很容易,但Cocos2d还包括重要的C函数,如上面所示。我不知道如何将其添加到ApiDefinition中,或者是否可能。我只是想知道,将此添加到绑定中的最佳方法是什么,这样我就可以从包含cocos2ddll的C#项目中引用上面的C函数。(我有一个DLL)你的C++编译器是什么?你使用IDE吗?再次谢谢你。昨晚我终于发现了使用DllImport的方法,但我无法让它工作,但我不知道把它放在哪里。(我先是试着把它放在额外的地方,然后又放在我实际的C#项目中)我会检查样本,看看是否能找到一个对我有帮助的例子。我搜索了github找不到Dllimport:repo:mono/monotouch绑定dllimports你在正确的轨道上,从源代码角度看,但可能不是从构建角度看。现在,您需要验证(a)您是否正确地将静态库与应用程序链接,例如不匹配的体系结构,以及(b)您拥有的静态库中是否存在该符号,例如,它被记录在coco2d 2.0+中,因此早期版本不会有该符号(这将导致您出现异常)。我尚未比较(发布/调试)构建日志-但只需要一个配置错误的宏和所有内容(或一件事)可能会被打断。谢谢你的完整答案。我希望如果其他人将来有类似的问题,这个答案能帮助他们。我花了一段时间才回到这个问题上来,因为我一直很忙,但现在我可以继续我的项目,所以再次感谢Poupou!这是一个很好的猜测。不幸的是,我使用的MonoTouch项目在这两种情况下都是调试的(因此,
mtouch
从不剥离任何内容)。有效的是
cocos2d.a
debug build(来自xcode),而发布版本缺少一些符号。我可能与MT相关(不知道如何),但xcode构建中肯定有一些不同(正确与否-但不同).ahh所以它是在xcode端,这个项目在Git上可用吗?我的意思是说,它是最新的Cocos2d xcode项目吗
public partial class CCGLProgram {
    [DllImport ("__Internal", EntryPoint="ccGLUseProgram")]
    public static extern void UseProgram (uint program);
}