2016-06-09 51 views
1

我面臨着一個消息AOT問題嘗試JIT編譯方法'(包裝託管到本機); ...包裝_aot_native(對象)'在運行時與 - 只 - 只。AOT問題與消息試圖與Xamarin iOS上的Pinvoke JIT編譯方法

我有一個包含應該由本機函數(稱爲LoadContext)進行初始化的方法指針的結構,這個結構看起來是:

[StructLayout (LayoutKind.Sequential)] 
public struct WrapperContext 
{ 
    public int ctxVersion; 

    public unsafe GetLibraryVersionXDelegate GetLibraryVersion; 

    public unsafe GetLibraryDateXDelegate GetLibraryDate; 

    public unsafe InitCallbackTableXDelegate InitCallbackTable; 

    ..... 
} 

當我打電話應該初始化WrapperContext結構的LoadContext本地方法中,下面的例外是由運行時引發:

試圖JIT編譯方法「(包裝管理到本機)XXXXX.XXXXXX.XXXXX.GetLibraryVersionXDelegate:wrapper_aot_native(對象)」,同時用運行--aot-只要。有關更多信息,請參閱http://docs.xamarin.com/ios/about/limitations

試圖解決這個問題,我創建了一個包含完全相同的字段列表中的其他結構,但IntPtr的更換委託類型:

[StructLayout (LayoutKind.Sequential)] 
public struct WrapperContext2 
{ 
    public int ctxVersion; 

    public IntPtr GetLibraryVersionXDelegate GetLibraryVersion; 

    public IntPtr GetLibraryDateXDelegate GetLibraryDate; 

    public IntPtr InitCallbackTableXDelegate InitCallbackTable; 

    ..... 
} 

現在,調用我的家鄉LoadContext正常工作並且我得到每個函數的指針,但是當試圖使用Marshal.GetFunctionPointerForDelegate()將函數指針轉換爲其代表表示形式時,運行時拋出了完全相同的異常:

嘗試JIT編譯方法'(包裝託管到本機)XXXXX.XXXXXX.XXXXX.GetLibraryVersionXDelegate:wrapper_aot_native(對象)'運行時使用 - 僅 - 只。有關更多信息,請參閱http://docs.xamarin.com/ios/about/limitations

感謝您的幫助。

回答

1

我終於通過在每個委託定義添加UnmanagedFunctionPointer屬性解決了這個問題:

[UnmanagedFunctionPointer(CallingConvention.StdCall)] 
public unsafe delegate IntPtr GetLibraryVersionXDelegate(); 

[UnmanagedFunctionPointer(CallingConvention.StdCall)] 
public unsafe delegate IntPtr GetLibraryDateXDelegate(); 

希望這有助於其他人。

+0

我有同樣的問題,但它說類型或命名空間UnmanagedFunctionPointer找不到。任何想法? – Darshana