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

Xamarin.iOS hem yerel C kitaplıkları hem Objective-C de kitaplıkları ile bağlamayı destekler. Bu belgede, yerel C kitaplıklarınızı Xamarin.iOS projenize nasıl bağlayabilirsiniz açıklanır. Kitaplıklar için aynı işlemi yapma hakkında bilgi için Objective-C Bağlama Objective-C Türleri belgemize bakın.

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

Genellikle iOS geliştirme için desteklenen platformların her biri için yerel kitaplıklarınızı oluşturmanız istenir (Simülatör için i386 ve cihazlar için ARMv7/ARM64). Kitaplığınız için zaten bir Xcode projeniz varsa, bu gerçekten çok basit bir işlemdir.

Yerel kitaplığınızın i386 sürümünü oluşturmak 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 MyProject.xcodeproj/build/Release-iphonesimulator/yerel bir statik kitaplıkla sonuçlanır. Kitaplık arşiv dosyasını (libMyLibrary.a) daha sonra kullanmak üzere güvenli bir yere kopyalayın (veya taşıyın), bundan sonra oluşturacağınız aynı kitaplığın arm64 ve armv7 sürümleriyle çakışmaması için benzersiz bir ad verin (libMyLibrary-i386.a gibi).

Yerel kitaplığınızın ARM64 sürümünü oluşturmak 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 çakışmaması için dosyayı libMyLibrary-arm64.a gibi bir konuma yeniden adlandırabilirsiniz.

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

/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şıdığınız konuma kopyalayın (veya taşıyın), bu dosyayı libMyLibrary-armv7.a gibi bir konuma yeniden adlandırın.

Evrensel ikili oluşturmak için aracı şu şekilde kullanabilirsiniz lipo :

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

Bu, tüm iOS geliştirme hedefleri için kullanıma uygun olacak evrensel (yağ) bir kitaplık olacak oluşturur libMyLibrary.a .

Eksik Gerekli Mimari i386

iOS Simülatöründe bir kitaplığı kullanmaya çalışırken Çalışma Zamanı Çıkışınızda bir does not implement methodSignatureForSelector veya does not implement doesNotRecognizeSelector iletisi alıyorsanız, kitaplığınız büyük olasılıkla i386 mimarisi için derlenmemiştir (yukarıdaki Evrensel Yerel Kitaplıklar Oluşturma bölümüne bakın).Objective-C

Belirli bir kitaplık tarafından desteklenen mimarileri denetlemek için Terminal'de aşağıdaki komutu kullanın:

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

Burada /full/path/to/ , kullanılmakta olan kitaplığın tam yolu ve libraryname.a söz konusu kitaplığın adıdır.

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

Kitaplığınızı Bağlama

Kullandığınız tüm üçüncü taraf kitaplıkların uygulamanızla statik olarak bağlanması gerekir.

İnternet'ten edindiğiniz veya Xcode ile derlediğiniz "libMyLibrary.a" kitaplığını statik olarak bağlamak istiyorsanız, birkaç şey yapmanız gerekir:

  • Kitaplığı projenize getirme
  • Kitaplığı bağlamak için Xamarin.iOS'yi yapılandırma
  • Kitaplıktan yöntemlere erişin.

Kitaplığı projenize getirmek için çözüm gezgininden projeyi seçin ve Command+Option+a tuşlarına basın. libMyLibrary.a dosyasına gidin ve projeye ekleyin. İstendiğinde Mac için Visual Studio veya Visual Studio'ya bunu projeye kopyalamasını söyleyin. Ekledikten sonra projede libFoo.a dosyasını bulun, sağ tıklayın ve Derleme Eylemi'ni yok olarak ayarlayın.

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

-gcc_flags "-L$(MSBuildProjectDirectory) -lMylibrary -force_load $(MSBuildProjectDirectory)/libMyLibrary.a"

Yukarıdaki örnekte libMyLibrary.a bağlantısı verilmiştir

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

-gcc_flags "-L$(MSBuildProjectDirectory) -lMylibrary -lSystemLibrary -framework CFNetwork -force_load $(MSBuildProjectDirectory)/libMyLibrary.a"

Yerel kitaplığınız C++ kodu içeriyorsa Xamarin.iOS dosyasının doğru derleyiciyi kullandığını bilmesi için "Ek Bağımsız Değişkenler" içinde -cxx bayrağını da geçirmeniz gerekir. C++ için önceki seçenekler şöyle görünür:

-cxx -gcc_flags "-L$(MSBuildProjectDirectory) -lMylibrary -lSystemLibrary -framework CFNetwork -force_load $(MSBuildProjectDirectory)/libMyLibrary.a"

C'den C Yöntemlerine Erişme#

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

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

  • Uygulamanızla birlikte sevk ettiğiniz statik kitaplıklar.

Bunlardan herhangi birinde tanımlanan yöntemlere erişmek için Mono'nun P/Invoke işlevini kullanırsınız ve bu da kabaca .NET'te kullandığınız teknolojiyle aynıdır:

  • Çağırmak istediğiniz C işlevini belirleme
  • İmzasını belirleme
  • Hangi kitaplıkta yaşadığını belirleme
  • Uygun P/Invoke bildirimini yazın

P/Invoke kullandığınızda, bağlandığınız kitaplığın yolunu belirtmeniz gerekir. iOS paylaşılan kitaplıklarını kullanırken yolu sabit kodlayabilir veya içinde Constantstanımladığımız kolaylık sabitlerini kullanabilirsiniz. Bu sabitler iOS paylaşılan kitaplıklarını kapsamalıdır.

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

void UIRectFrameUsingBlendMode (CGRect rect, CGBlendMode mode);

P/Invoke bildiriminiz şöyle görünür:

[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 isteğe bağlı olarak dış adı (UIRectFramUsingBlendMode) belirtmemize olanak tanırken C# dilinde farklı bir ad gösterir ve daha kısa olan RectFrameUsingBlendMode.

C Dylibs erişimi

Xamarin.iOS uygulamanızda bir C Dylib kullanmanız gerekiyorsa, özniteliği çağırmadan DllImport önce gereken biraz ek kurulum vardır.

Örneğin, uygulamamızda çağıracağımız bir Animal_Version yönteme sahipsekAnimal.dylib, kullanmaya çalışmadan önce Xamarin.iOS'a kitaplığın konumunu bildirmemiz gerekir.

Bunu yapmak için dosyayı düzenleyin Main.CS ve aşağıdaki gibi görünmesini sağlayın:

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 kullanıldığında yöntemine Animal_Version şu şekilde bağlanabiliriz:

[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ı kurulacak bir dış paylaşılan kitaplık yoktur, bu nedenle DllImport özniteliğindeki yol parametresinin yol adının aksine özel adı __Internal kullanması gerekir (adın başındaki çift alt çizgi karakterlerine dikkat edin).

Bu, DllImport'u paylaşılan bir kitaplıktan yüklemeye çalışmak yerine geçerli programda başvurduğunuz yöntemin simgesini aramaya zorlar.