Xamarin.iOS'ta Yerel Kitaplıklara Başvuru

Xamarin.iOS, hem yerel C kitaplıkları hem de kitaplıkları ile Objective-C bağlantıyı destekler. Bu belgede, yerel C kitaplıklarınızı Xamarin.iOS projenize nasıl bağlayabilirsiniz? Kitaplıklar için de aynı şeyi yapma Objective-C hakkında bilgi için belgemize Binding Objective-C Types bakın.

Evrensel Yerel Kitaplıklar (i386, ARMv7 ve ARM64)

iOS geliştirme için desteklenen platformların her biri için yerel kitaplıklarınızı derlemek genellikle tercih edilir (Simülatör için i386 ve cihazlar için ARMv7/ARM64). Kitaplığınız için zaten bir Xcode projeniz varsa bunu yapmak oldukça önemsizdir.

Yerel kitaplığının i386 sürümünü derlemek için terminalden aşağıdaki komutu çalıştırın:

/Developer/usr/bin/xcodebuild -project MyProject.xcodeproj -target MyLibrary -sdk iphonesimulator -arch i386 -configuration Release clean build

Bu, altında yerel bir statik kitaplıkla MyProject.xcodeproj/build/Release-iphonesimulator/ sonuçlandır. Kitaplık arşiv dosyasını (libMyLibrary.a) kopyalayıp daha sonra kullanmak üzere güvenli bir şekilde kullanmak üzere kopyalayın (libMyLibrary-i386.agibi) benzersiz bir ad vererek daha sonra derlemeniz gereken kitaplığın arm64 ve armv7 sürümleriyle çatışmasın.

Yerel kitaplığının ARM64 sürümünü derlemek için aşağıdaki komutu çalıştırın:

/Developer/usr/bin/xcodebuild -project MyProject.xcodeproj -target MyLibrary -sdk iphoneos -arch arm64 -configuration Release clean build

Bu kez, yerleşik yerel kitaplık içinde MyProject.xcodeproj/build/Release-iphoneos/ bulunur. Bir kez daha, bu dosyayı güvenli bir konuma kopyalayın (veya taşıyın) ve bu dosyayı libMyLibrary-arm64.a gibi bir konuma yeniden anlayıp bu dosyayı çatıştırmamalarını sağlamak için kullanın.

Şimdi kitaplığın ARMv7 sürümünü derleme:

/Developer/usr/bin/xcodebuild -project MyProject.xcodeproj -target MyLibrary -sdk iphoneos -arch armv7 -configuration Release clean build

Sonuçta elde edilen kitaplık dosyasını kitaplığın diğer 2 sürümünü taşımış olduğu konuma kopyalayın (veya taşıyın) ve libMyLibrary-armv7.agibi bir şeye yeniden adını verdi.

Evrensel ikili dosya yapmak için aracı şu lipo şekilde kullanabilirsiniz:

lipo -create -output libMyLibrary.a libMyLibrary-i386.a libMyLibrary-arm64.a libMyLibrary-armv7.a

Bu, tüm iOS geliştirme hedeflerine uygun olacak evrensel libMyLibrary.a (fat) bir kitaplık oluşturur.

Gerekli Mimari Eksik i386

iOS Simülatöründe bir kitaplığı tüketmeye çalışırken Çalışma Zamanı Çıkışınıza bir veya iletisi alıyorsanız, kitaplığınız büyük olasılıkla does not implement methodSignatureForSelectordoes not implement doesNotRecognizeSelectorObjective-C i386 does not implement methodSignatureForSelector mimarisi için derlenmiş değildir (yukarıdaki Evrensel Yerel Kitaplıklar Oluşturma bölümüne bakın).

Verilen bir kitaplık tarafından desteklenen mimarileri kontrol etmek için Terminalde aşağıdaki komutu kullanın:

lipo -info /full/path/to/libraryname.a

Burada, /full/path/to/ tüketilen kitaplığın tam yolu ve libraryname.a söz konusu kitaplığın adıdır.

Kitaplığın kaynağına sahipsanız, iOS simülatöründe test etmek için i386 mimarisi için de derlemeniz ve paketleniz gerekir.

Kitaplığınızı Bağlama

Tükettiğiniz tüm üçüncü taraf kitaplıkların uygulamanıza statik olarak bağlı olması gerekir.

İnternet'den edinilen veya Xcode ile derlemek için "libMyLibrary.a" kitaplığını statik olarak bağlamanız gerekirse, birkaç şey yapmak gerekir:

  • Kitaplığı projenize getirme
  • Kitaplığı bağacak şekilde Xamarin.iOS'u yapılandırma
  • Kitaplıktan yöntemlere erişin.

Kitaplığı projenize getirmek için çözümgezgininden projeyi seçin ve Command+Option+a tuşlarına basın. libMyLibrary.a'ya gidin ve projeye ekleyin. İstendiğinde, Mac için Visual Studio veya Visual Studio projeye kopyalamayı söyleyin. Ekledikten sonra projede libFoo.a öğesini bulun, sağ tıklayın ve Derleme Eylemi'nin hiçbiri olarakayarlayın.

Xamarin.iOS'uKitaplığını Bağacak Şekilde Yapılandırmak için, son yürütülebilir dosyanız için proje seçeneklerinde (kitaplığın kendisi değil, son program) iOSDerlemesi'nin Ek bağımsız değişkenine (bunlar proje seçeneklerinizin bir parçası) "-gcc_flags" seçeneğini ve ardından programınız için gerekli olan tüm ek kitaplıkları içeren tırnaklı bir dize eklemeniz gerekir, örneğin:

-gcc_flags "-L${ProjectDir} -lMylibrary -force_load ${ProjectDir}/libMyLibrary.a"

Yukarıdaki örnekte libMyLibrary.a bağlantısı ve verilecektir

Yürütülebilir dosyanın son bağlantısını yapmak için kullanılan GCC herhangi bir komut satırı bağımsız -gcc_flags değişkeni kümesi belirtmek için kullanabilirsiniz. Örneğin, bu komut satırı CFNetwork çerçevesine de başvurur:

-gcc_flags "-L${ProjectDir} -lMylibrary -lSystemLibrary -framework CFNetwork -force_load ${ProjectDir}/libMyLibrary.a"

Yerel kitaplığınız C++ kodu içeriyorsa, Xamarin.iOS'un doğru derleyiciyi kullanmayı bilmiş olması için "Ek Bağımsız Değişkenler" içinde -cxx bayrağını da geçmeniz gerekir. C++ için önceki seçenekler şöyle olur:

-cxx -gcc_flags "-L${ProjectDir} -lMylibrary -lSystemLibrary -framework CFNetwork -force_load ${ProjectDir}/libMyLibrary.a"

C'den C Yöntemlerine Erişme #

iOS'ta iki tür yerel kitaplık mevcuttur:

  • İşletim sisteminin parçası olan paylaşılan kitaplıklar.

  • Uygulamanıza birlikte göndertikleri statik kitaplıklar.

Bunlardan herhangi biri içinde tanımlanan yöntemlere erişmek için, .NET'te kullanmakla aynı teknoloji olan Mono'nun P/Invoke işlevini kullanır ve bu da kabaca şöyledir:

  • Çağırmak istediğiniz C işlevini belirleme
  • İmzasını belirleme
  • Hangi kitaplığın içinde olduğunu belirleme
  • Uygun P/Invoke bildirimini yazma

P/Invoke'ı kullanırken, bağlantı için kitaplık yolunu belirtmeniz gerekir. iOS paylaşılan kitaplıklarını kullanırken yolu sabit kod haline veya içinde tanımlandığımız kolaylık sabitlerini kullanabilirsiniz. Bu sabitler iOS paylaşılan kitaplıklarını Constants kapsayacaktır.

Örneğin, Apple'ın UIKit kitaplığından C'de bu imzaya sahip UIRectFrameUsingBlendMode yöntemini çağırmak istediyebilirsiniz:

void UIRectFrameUsingBlendMode (CGRect rect, CGBlendMode mode);

P/Invoke bildiriminiz şöyle olur:

[DllImport (Constants.UIKitLibrary,EntryPoint="UIRectFrameUsingBlendMode")]
public extern static void RectFrameUsingBlendMode (RectangleF rect, CGBlendMode blendMode);

Constants.UIKitLibrary yalnızca "/System/Library/Frameworks/UIKit.framework/UIKit" olarak tanımlanan bir sabittir. EntryPoint, C# içinde farklı bir ad gösterirken isteğe bağlı olarak dış adı (UIRectFramUsingBlendMode) belirtmemizi sağlar. Bu, kısa rectFrameUsingBlendMode değeridir.

C Dylibs'lere erişme

Xamarin.iOS uygulamanıza bir C Dylib tüketmeniz gerekirse, özniteliğini çağırmadan önce gereken fazladan bir kurulum DllImport vardır.

Örneğin, uygulamamızda çağıracak yöntemi olan bir varsa, bunu tüketmeye çalışmadan önce Animal.dylibAnimal_Version Xamarin.iOS'a kitaplığın konumunu bildirmemiz gerekir.

Bunu yapmak için dosyasını Main.CS düzenleyin ve aşağıdakine benzer şekilde düzenleyin:

static void Main (string[] args)
{
    // Load Dylib
    MonoTouch.ObjCRuntime.Dlfcn.dlopen ("/full/path/to/Animal.dylib", 0);

    // Start application
    UIApplication.Main (args, null, "AppDelegate");
}

Burada, /full/path/to/ tüketilen Dylib'in tam yoludur. Bu kod yerinde, yöntemine aşağıdaki gibi Animal_Version bağlantı verilmiştir:

[DllImport("Animal.dylib", EntryPoint="Animal_Version")]
public static extern double AnimalLibraryVersion();

Statik Kitaplıklar

iOS'ta yalnızca statik kitaplıkları kullanabileceğiniz için bağlantı verilecek dış paylaşılan kitaplık yoktur, bu nedenle DllImport özniteliğinde yol parametresinin yol adının aksine özel adı (adın başındaki çift alt çizgi karakterlerini not edin) kullanması __Internal gerekir.

Bu, DllImport'ı paylaşılan bir kitaplıktan yüklemek yerine geçerli programda başvurarak yöntemin sembolünü bulmaya zorlar.