- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
头文件包括以下内容:
#include <Foundation/Foundation.h>
FOUNDATION_EXPORT NSString* GoGopherExecute(NSString* action, NSString* data);
我看过How do I correctly wrap native c library in Xamarin.iOS ,这似乎最接近我正在尝试做的事情。我还在 Xamarin 网站上看到了资源 https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-c-libraries/ .我的 ApiDefinition.cs 中有以下内容
[DllImport("Gopher.a",
EntryPoint="GoGopherExecute",
CallingConvention = CallingConvention.Cdecl)]
public static NSString GoExecute(NSString action, NSString data);
我得到的错误是“意外的符号‘NSString’,需要‘class’、‘delegate’、‘enum’、‘interface’、‘partial’或‘struct’”。我应该在 ApiDefinition.cs 中包含什么?
最佳答案
当您接近时,您确实需要一些额外的步骤才能使其完全正常工作。但首先你需要掌握 Xamarin.iOS 绑定(bind)项目的一些概念。
这是 Xamarin.iOS 绑定(bind)项目结构:
大多数时候您只需要项目模板附带的两个文件(我手动添加了 Extras.cs):
ApiDefinition.cs: will only contain namespaces and interface definitions (with any members that an interface can contain) and should not contain classes, enumerations, delegates or structs. The API definition file is merely the contract that will be used to generate the API.
StructsAndEnums.cs: any enums, types, structs required by the API definition file.
因此,在 ApiDefinition 中需要注意的一件事是它只能包含 ObjC 定义,因此您上面的代码必须添加到一个额外的 c# 代码文件中,因为它是一个 c 函数,只需将一个新类添加到您的绑定(bind)项目中我倾向于将此文件命名为 Extras.cs(您可以随意命名它)。
// Extras.cs contents
using System;
using System.Runtime.InteropServices;
using Foundation;
using ObjCRuntime;
namespace FooBinding {
public static class GoGopherCFuncs {
// FOUNDATION_EXPORT NSString* GoGopherExecute(NSString* action, NSString* data);
[DllImport ("__Internal", EntryPoint= "GoGopherExecute")]
static extern IntPtr _GoExecute (IntPtr action, IntPtr data);
public static string GoExecute (string action, string data)
{
// Avoid creating any unused managed refs of NSString and get a handle directly
// from our managed NET strings
IntPtr actionPtr = NSString.CreateNative (action);
IntPtr dataPtr = NSString.CreateNative (data);
IntPtr ptr = _GoExecute (actionPtr, dataPtr);
// Manually release our native NSString handles
NSString.ReleaseNative (actionPtr);
NSString.ReleaseNative (dataPtr);
// Return a NET string from our unmanaged handle returned by _GoExecute.
return (string) Runtime.GetNSObject<NSString> (ptr);
}
}
}
所以上面的代码应该足以解决您的问题并让您开始绑定(bind)任何额外的 c API。
在DllImport
属性中还有一个你需要修改的东西,你需要将dllName
更改为__Internal
,这是因为它Gopher.a
很可能是一个静态库(您可以检查 this other answer 以确认它是否是一个静态库)所以它将“合并”到您的主要可执行文件中,因此您只需要将 Gopher.a
添加到您的绑定(bind)项目中,如 Xamarin Documentation 中所述.
To complete this binding, you should add the native library to the project. You can do this by adding the native library to your project, either by dragging and dropping the native library from Finder onto the project in the solution explorer ...
我真的鼓励您阅读 Xamarin Documentation :)
希望这对您有所帮助!
关于c# - 如何在 Xamarin.iOS 中包装 Objective-C 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36755982/
我遵循了一本名为“Sitepoint Full Stack Javascript with MEAN”的书中的教程,我刚刚完成了第 6 章,应该已经创建了一个带有“数据库”的“服务器”。数据库只不过是
在 Jquery 中,我创建两个数组,一个嵌入另一个数组,就像这样...... arrayOne = [{name:'a',value:1}, {name:'b',value:2}] var arra
这个问题在这里已经有了答案: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wa
我被放在别人的代码上,有一个类用作其他组件的基础。当我尝试 ng serve --aot(或 build --prod)时,我得到以下信息。 @Component({ ...,
我正在测试一些代码,并使用数据创建了一个 json 文件。 问题是我在警报中收到“[object Object],[object Object]”。没有数据。 我做错了什么? 这是代码:
我想打印 [object Object],[object Object] 以明智地 "[[{ 'x': '1', 'y': '0' }, { 'x': '2', 'y': '1' }]]"; 在 ja
我有一个功能 View ,我正在尝试以特殊格式的方式输出。但我无法让列表功能正常工作。 我得到的唯一返回是[object Object][object Object] [object Object]
在使用优秀的 Sim.js 和 Three.js 库处理 WebGL 项目时,我偶然发现了下一个问题: 一路走来,它使用了 THREE.Ray 的下一个构造函数: var ray = new THRE
我正在使用 Material UI 进行多重选择。这是我的代码。 {listStates.map(col => (
我的代码使用ajax: $("#keyword").keyup(function() { var keyword = $("#keyword").val(); if (keyword.
我遇到了下一个错误,无法理解如何解决它。 Can't resolve all parameters for AuthenticationService: ([object Object], ?, [o
我正在尝试创建一个显示动态复选框的表单,至少应选中其中一个才能继续。我还需要获取一组选中的复选框。 这是组件的代码: import { Component, OnInit } from '@angul
我正在开发 NodeJs 应用程序,它是博客应用程序。我使用了快速验证器,我尝试在 UI 端使用快速闪存消息将帖子保存在数据库中之前使用闪存消息验证数据,我成功地将数据保存在数据库中,但在提交表单后消
我知道有些人问了同样的问题并得到了解答。我已经查看了所有这些,但仍然无法解决我的问题。我有一个 jquery snipet,它将值发送到处理程序,处理程序处理来自 JS 的值并将数据作为 JSON 数
我继承了一个非常草率的项目,我的任务是解释为什么它不好。我注意到他们在整个代码中都进行了这样的比较 (IQueryable).FirstOrDefault(x => x.Facility == fac
我只是在删除数组中的对象时偶然发现了这一点。 代码如下: friends = []; friends.push( { a: 'Nexus', b: 'Muffi
这两个代码片段有什么区别: object = nil; [object release] 对比 [object release]; object = nil; 哪个是最佳实践? 最佳答案 object
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我在不同的对象上安排不同的选择器 [self performSelector:@selector(doSmth) withObject:objectA afterDelay:1]; [self per
NSLog(@"%p", &object); 和 NSLog(@"%p", object); 有什么区别? 两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。 最佳答案 这就是我喜欢的
我是一名优秀的程序员,十分优秀!