6

私がバインドしているObjectiveCライブラリには、アプリケーションでアクセスする必要のある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);
    }
}

残念ながら、エントリポイントが見つかりませんというエラーが発生します。私の最初の考えは多分関数が壊れていることだと思いますが、「外部C」があるので、起こってはいけないことだと思いましたか?誰か助けてもらえますか?

4

2 に答える 2

7

必要な追加のCAPIに対して、従来の.NET p/invokesを追加でき[DllImport]ます。バインディングは2段階のプロセスであるため、バインディングアセンブリに簡単に追加できます。

最初に、API定義(インターフェース)が追加の定義(例enums)とともに一時的なアセンブリにコンパイルされます。

次に、そのアセンブリを使用してコードを生成します(を使用btouch):使用するバインディング。その段階で、 p / invokesのようなより多くのコードを含めることができるので、それらは最終的なコンパイル済みのバインディングアセンブリの一部になります。

トリック:GITのモノタッチバインディングにはたくさんのサンプルがあります。grepするだけでDllImportいくつか見つかります。

編集(2013-01-08)

デバッグで再構築すると機能するため、Makefileによって実行されるリリースビルドに問題があります(単に呼び出す場合でも)。例えばxcodebuildlibcocos2d.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);
}

そして、JumpyデモアプリCCGLProgram.UseProgram (0);のメソッド内からの呼び出しを追加しました。FinishedLaunching

編集(2013-01-12)

デバッグビルドとリリースビルドは非常に似ています(驚くことではありません)。デバッグビルドには、デバッグ関連の定義がいくつかあります(これも驚くことではありません)。OTOHリリースビルドが完了しました。これを使用し-fvisibility=hiddenて(後で検証する必要があります)、この問題の適切な候補のように聞こえます。

これは確かに(デフォルトではない、最後の列を参照)Xcodeプロジェクトのビルド設定です。この設定を[いいえ](通常はデフォルト)に変更すると、通常(上記のように)を使用してC関数を呼び出すことができるリリースビルドが生成されます。謎が解けた:-) [DllImport]

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 に答える