共用方式為


進階 (手動) 真實世界範例

此範例使用來自 FacebookPOP 連結庫。

本節涵蓋更進階的系結方法,我們將使用Apple的工具 xcodebuild 先建置 POP 專案,然後手動推算 Objective Sharpie 的輸入。 這基本上涵蓋了 Objective Sharpie 在上一節的幕後所做的事情。

 $ git clone https://github.com/facebook/pop.git
Cloning into 'pop'...
   _(more git clone output)_

$ cd pop

因為 POP 連結庫有 Xcode 專案 (pop.xcodeproj),所以我們只能用來 xcodebuild 建置 POP。 此程式可能會產生 Objective Sharpie 可能需要剖析的頭檔。 這就是為什麼在系結之前建置很重要的原因。 透過 建置 xcodebuild 時,請務必傳遞您想要傳遞至 Objective Sharpie 的相同 SDK 標識符和架構(請記住,Objective Sharpie 3.0 通常可以為您執行此動作!):

$ xcodebuild -sdk iphoneos9.0 -arch arm64

Build settings from command line:
    ARCHS = arm64
    SDKROOT = iphoneos8.1

=== BUILD TARGET pop OF PROJECT pop WITH THE DEFAULT CONFIGURATION (Release) ===

...

CpHeader pop/POPAnimationTracer.h build/Headers/POP/POPAnimationTracer.h
    cd /Users/aaron/src/sharpie/pop
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Users/aaron/bin::/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/git/bin:/Users/aaron/.rvm/bin"
    builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -strip-debug-symbols -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip -resolve-src-symlinks /Users/aaron/src/sharpie/pop/pop/POPAnimationTracer.h /Users/aaron/src/sharpie/pop/build/Headers/POP

...

** BUILD SUCCEEDED **

控制台中將會有許多組建信息輸出,做為的一 xcodebuild部分。 如上所示,我們可以看到執行 「CpHeader」 目標,其中頭檔已複製到組建輸出目錄。 這種情況通常如此,而且讓系結更容易:作為原生連結庫組建的一部分,頭檔通常會複製到「公開」消費性位置,讓剖析更容易進行系結。 在此情況下,我們知道 POP 的頭檔位於 build/Headers 目錄中。

我們現在已準備好系結 POP。 我們知道我們想要使用arm64架構來建置 SDKiphoneos8.1,而我們關心的頭文件位於 build/Headers POP Git 簽出之下。 如果我們查看 build/Headers 目錄,我們將會看到一些頭檔:

$ ls build/Headers/POP/
POP.h                    POPAnimationTracer.h     POPDefines.h
POPAnimatableProperty.h  POPAnimator.h            POPGeometry.h
POPAnimation.h           POPAnimatorPrivate.h     POPLayerExtras.h
POPAnimationEvent.h      POPBasicAnimation.h      POPPropertyAnimation.h
POPAnimationExtras.h     POPCustomAnimation.h     POPSpringAnimation.h
POPAnimationPrivate.h    POPDecayAnimation.h

如果我們查看 POP.h,我們可以看到它是連結庫的主要最上層標頭檔, #import也就是其他檔案。 因此,我們只需要傳遞 POP.h 至 Objective Sharpie,而 clang 會在幕後執行其餘動作:

$ sharpie bind -output Binding -sdk iphoneos8.1 \
    -scope build/Headers build/Headers/POP/POP.h \
    -c -Ibuild/Headers -arch arm64

Parsing Native Code...

Binding...
  [write] ApiDefinitions.cs
  [write] StructsAndEnums.cs

Binding Analysis:
  Automated binding is complete, but there are a few APIs which have
  been flagged with [Verify] attributes. While the entire binding
  should be audited for best API design practices, look more closely
  at APIs with the following Verify attribute hints:

  ConstantsInterfaceAssociation (1 instance):
    There's no fool-proof way to determine with which Objective-C
    interface an extern variable declaration may be associated.
    Instances of these are bound as [Field] properties in a partial
    interface into a near-by concrete interface to produce a more
    intuitive API, possibly eliminating the 'Constants' interface
    altogether.

  StronglyTypedNSArray (4 instances):
    A native NSArray* was bound as NSObject[]. It might be possible
    to more strongly type the array in the binding based on
    expectations set through API documentation (e.g. comments in the
    header file) or by examining the array contents through testing.
    For example, an NSArray* containing only NSNumber* instances can
    be bound as NSNumber[] instead of NSObject[].

  MethodToProperty (2 instances):
    An Objective-C method was bound as a C# property due to
    convention such as taking no parameters and returning a value (
    non-void return). Often methods like these should be bound as
    properties to surface a nicer API, but sometimes false-positives
    can occur and the binding should actually be a method.

  Once you have verified a Verify attribute, you should remove it
  from the binding source code. The presence of Verify attributes
  intentionally cause build failures.

  For more information about the Verify attribute hints above,
  consult the Objective Sharpie documentation by running 'sharpie
  docs' or visiting the following URL:

    http://xmn.io/sharpie-docs

Submitting usage data to Xamarin...
  Submitted - thank you for helping to improve Objective Sharpie!

Done.

您會發現我們已將自 -scope build/Headers 變數傳遞給 Objective Sharpie。 因為 C 和 Objective-C 連結庫必須 #import 或其他 #include 頭文件,這些標頭檔是連結庫實作詳細數據,而不是您想要繫結的 API,自 -scope 變數會告知 Objective Sharpie 忽略目錄中某個位置 -scope 檔案中未定義的任何 API。

您會發現自 -scope 變數通常對於全新實作的連結庫而言是選擇性的,不過明確提供連結庫不會造成任何傷害。

提示

如果連結庫的標頭匯入任何 iOS SDK 標頭,例如 #import <Foundation.h>,則您必須設定範圍,否則 Objective Sharpie 會產生匯入之 iOS SDK 標頭的系結定義,導致編譯系結專案時可能會產生錯誤的巨大系結。

此外,我們指定 -c -Ibuild/headers了 。 首先,自 -c 變數會告知 Objective Sharpie 停止解譯命令行自變數,並將任何後續自 變數直接傳遞至 clang 編譯程式。 因此,是 clang 編譯程式自變數, -Ibuild/Headers 會指示 clang 搜尋 底下的 build/Headersinclude,也就是 POP 標頭所在的位置。 如果沒有這個自變數,clang 就不知道在何處找出正在#import執行的檔案POP.h幾乎所有使用 Objective Sharpie 的“問題”都歸結為找出要傳遞至俚語的內容。

正在完成系結

Objective Sharpie 現在已 Binding/ApiDefinitions.cs 產生 和 Binding/StructsAndEnums.cs 檔案。

這些是 Objective Sharpie 在系結上的基本第一次傳遞,在少數情況下,您可能只需要一切。 不過,如上所述,開發人員通常需要在 Objective Sharpie 完成之後手動修改產生的檔案,以 修正工具無法自動處理的任何問題

更新完成後,現在可以將這兩個檔案新增至Visual Studio for Mac中的系結專案,或直接傳遞至 btouchbmac 工具,以產生最終系結。

如需系結程式的完整描述,請參閱我們的 完整逐步解說指示