Вопрос

Привязка объективенного класса к проблеме C #

Проект Monotouch описывает, как связать типы объектов-C для использования с Monotouch. Мы не смогли сделать это для библиотеки Admob (см. Также Блог Monotouch-Binding-for-Admob в Sabonrai Dot WordPress Dot Com.

Поэтому мы решили создать самый маленький возможный тестовый проект. Мы написали простой класс OBJC с двумя простыми методами, который возвращает строку, и тот, который возвращает целое число.

Вот tstlib.h:

#import <Cocoa/Cocoa.h>
@interface TstCls : NSObject {
}
- (NSString *) Version;
- (int) GimmeAnInt;
@end

и файл tstlib.m:

#import "TstCls.h"
@implementation TstCls
- (NSString *) Version {
    return @"I ain't got a version, I'm a poor lonesome cowboy...";
}
- (int) GimmeAnInt {
    return 110646;
}
@end

У нас есть небольшой проект консоли OBJC, чтобы подтвердить эту библиотеку. Вот код:

#import <Cocoa/Cocoa.h>
#import "../TstLib/TstCls.h"
int main(int argc, char *argv[])
{
    TstCls* tstCls = [[TstCls alloc] init];
    NSLog(@"version = %@", [tstCls Version]);
    NSLog(@"the int = %d", [tstCls GimmeAnInt]);
    return NSApplicationMain(argc,  (const char **) argv);
}

Итак, давайте определим файл связывания для утилиты Btouch.

using MonoTouch.Foundation;
namespace TstLib {
  [BaseType (typeof (NSObject))]
    interface TstCls {
      [Export ("Version")]
      string Version ();
      [Export ("GimmeAnInt")]
      int GimmeAnInt ();
    }
}

Затем мы создаем файл libtstlib.a и a tstlib.dll с утилитой Btouch:

/Developer/MonoTouch/usr/bin/btouch -o TstLib.dll TstCls.cs

Теперь создаем новое «APITEST APITEST» APITEST APPITEST «APITEST» Monotouch Window, добавьте каталог lib с файлами libtstlib.a и tstlib.dll, добавьте ссылку на этот tstlib.dll и интегрируйте наш tstlib в main.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using TstCls;
namespace ApiTest
{
  // -gcc_flags "-L${ProjectDir}/Lib -lTstLib -ObjC"
  // or
  // -gcc_flags "-L${ProjectDir}/Lib -lTstLib -force_load ${ProjectDir}/Lib/libTstLib.a"
  public class Application
  {
    static void Main (string[] args)
    {
      UIApplication.Main (args);
    }
  }
  // The name AppDelegate is referenced in the MainWindow.xib file.
  public partial class AppDelegate : UIApplicationDelegate
  {
    // This method is invoked when the application has loaded its UI and its ready to run
    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
      // If you have defined a view, add it here:
      // window.AddSubview (navigationController.View);

      TstLib.TstCls tstCls = new TstLib.TstCls ();
      Console.WriteLine ("TstLib.TstCls.Version() -> '{0}'", tstCls.Version ());
      Console.WriteLine ("TstLib.TstCls.GimmeAnInt() -> '{0}'", tstCls.GimmeAnInt ());
      window.MakeKeyAndVisible ();
      return true;
    }
    // This method is required in iPhoneOS 3.0
    public override void OnActivated (UIApplication application)
    {
    }
  }
}

Этот небольшой проект работает без двух консольных операторов. Он вылетает без какого-либо вывода, как только одна из операторов Console.Writeline выполняется.

Мы старались быть максимально краткими, все еще предоставляя достаточно информации, чтобы воссоздать тестовый случай. Мы очень готовы предоставить любую дополнительную информацию, чтобы помочь исправить это.

Кто-нибудь понимает, почему это не работает должным образом? Мы ограничивались минимальными минимумом для проверки, можем ли мы предоставить и использовать привязку для минимального класса OBJC.

К сожалению, это не удается. И он не проходит так же, как проект MT_SAMPLEADMOB, описанный в блоге Monotouch-Binding-for-Admob.

Наш маленький проект использует подход Btouch, описанный на Net Net Monotouch Dot под заголовком Binding_New_Objective-C_Types, тогда как проект MT_SAMPLEADMOB использует подход «Ручной», описанный в том же месте.

Оба подхода терпят неудачу в аналогичном вопросе. Как только будет называется метод класса или экземпляра, приложение просто сбивается без какого-либо вывода.

Мы понятия не имели, что можно сделать, чтобы определить эту проблему и прийти к решению. Monotouch предоставляет привязки C # для многих классов OBJC, поэтому его должно быть возможно. Мы тщательно изучили документы Monotouch, упомянутые выше. Мы не видели, где либо MT_SAMPLEADMOB, либо этот подход Btouch отклонится от предписанной процедуры, и все же оба выключены!

Так что на самом деле мы отчаянно нужна помощь здесь ...

Это было полезно?

Решение

Вы, вероятно, не отключали режим большого пальца для вашей собственной библиотеки. С тех пор, как IOS SDK 3.0 Apple Linker имеет проблемы, связанные с библиотеками большого пальца в более крупные проекты.

Вы можете отключить режим большого пальца, открывая свою собственную библиотеку в XCode и выполняя следующее:

  1. Проект -> Редактировать настройки проекта
  2. Тип «Большой палец» в «Поиск в настройках сборки»
  3. Снимите флажок
  4. Восстановите вашу родную библиотеку.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top