让 VS 编译 MonoTouch 项目源文件不再出错
2012-04-25 21:15
239 查看
使用 MonoTouch 做 iOS 开发, 由于 MonoDevelop 和 VS 2010 相比, 功能差的太多, 通常会相应的建立两个项目, 一个是 MonoDevelop 项目, 在 OSX 下使用, 一个是 VS 项目, 在 Windows 下使用, 在 Windows 系统下进行编码, 之后再在 OSX 下进行调试。 不过, 默认的 VS 项目在添加 MonoTouch 项目的 CS 源文件之后, 经常编译出错, 而且如果安装了 Resharper 之类的插件之话, 也会得到一大堆错误信息, 令人感觉非常恶心。 经过一番研究发现是因为 VS 不能引用 MonoTouch 的几个核心 dll 文件导致的, 包括 mscorlib.dll , System.dll , System.Core.dll 等, 找到原因之后, 对应的解决方法就有了。
新建项目, .Net Framework 选择 4.0 或以上, 项目类型选择类库项目, 项目名称为 MonoTouchLib , 如下图所示:
编辑项目属性, 选择 build 选项卡, Configuration 选择 All Configurations , 点击右下角的 advanced 按钮, 在弹出的 Advanced Build Setting 对话框中勾选 Do not reference mscorlib.dll , 如下图所示:
右击 MonoTouchLib 项目, 在上下文菜单选择 Unload Project , 再次右击, 选择 Edit MonoTouchLib.csproj , 按照下图对项目文件进行修改:
修改好之后, 保存并重新加载项目即可。 把这个项目导出为项目模板, 以后就不用每次都重复设置了。
如果再要引用其它的 MonoTouch 组件, 可以尝试直接添加引用, 如果发现引用路径不正确的话, 还按照这个方法进行修改。
这样修改过后的项目, 不仅可以顺利编译 MonoTouch 项目的源文件, Resharper 也不再提示错误。
分类: Mono, iOS
互联网上有很多热心网友提供的 CacoaTouch 类库, 如果想使用这些类库, 完全用 C# 重写是不可取的, 所以就要用到 MonoTouch 的绑定技术。
绑定技术听起来高深, 其实仔细研究起来, 其实并不难。 接下来, 以 KKGridView 为例, 说明怎样绑定 CocoaTouch 类库项目。
绑定项目默认结构如下, 包含两个文件: ApiDeginition.cs 和 StructsAndEnums.cs , 其中 ApiDefinition 用于绑定 CacoaTouch 类库定义的 interface 、 delegate 与 protocol 及其成员, 而 StructsAndEnums 用于绑定 ApiDefinition 所需的结构、 枚举以及其它。 这两个文件的编译方式是不同的, 所以对应的 C# 类型必须对号入座才行。
?
等命令行运行完毕, 源代码就获取好了, 接下来要编译 KKGridView , 接着输入下面的命令:
?
现在打开 MonoDevelop 将最终生成的 libKKGridView.a 添加到绑定项目 , 现在可以开始进行绑定了。
?
MyType 与 ObjC 的类型对应, TypeBase 与 ObjC 的基类对应, Protocol1 、 Prodocol2 与 ObjC 类型实现的协议对应。
interface
ObjC 的 interface 定义如下:
?
对应的绑定语法如下:
?
protocol
ObjC 的 protocol 定义语法如下:
?
或者
?
ObjC 的 protocol 与 C# 的 interface 有些类似, 但是 protocol 中定义的方法有两种, optional 和 required , 又有点儿像抽象类, MonoTouch 将其绑定为类, 并添加 ModelAttribute 标记, 对应的绑定语法分别为:
?
instance method
实例方法绑定为对应的 C# 实例方法:
?
?
如果是 protocol 的 required 方法, 则在对应的 C# 方法上添加 Abstract 标记, 例如:
?
?
class method
ObjC 中的 class method 与 C# 中的静态方法概念一致, 因此绑定为 C# 的静态方法, 例如:
?
?
property
ObjC 的属性通常由 setPropertyName 、 propertyName 两个方法组成, 绑定为 C# 的属性:
?
?
如果不是由默认的两个方法组成, 例如:
?
对应的绑定为:
?
enum
枚举的绑定是最容易的, 不过要放在 enums.cs 文件中, 例如:
?
?
分类: Mono, iOS
新建项目, .Net Framework 选择 4.0 或以上, 项目类型选择类库项目, 项目名称为 MonoTouchLib , 如下图所示:
编辑项目属性, 选择 build 选项卡, Configuration 选择 All Configurations , 点击右下角的 advanced 按钮, 在弹出的 Advanced Build Setting 对话框中勾选 Do not reference mscorlib.dll , 如下图所示:
右击 MonoTouchLib 项目, 在上下文菜单选择 Unload Project , 再次右击, 选择 Edit MonoTouchLib.csproj , 按照下图对项目文件进行修改:
修改好之后, 保存并重新加载项目即可。 把这个项目导出为项目模板, 以后就不用每次都重复设置了。
如果再要引用其它的 MonoTouch 组件, 可以尝试直接添加引用, 如果发现引用路径不正确的话, 还按照这个方法进行修改。
这样修改过后的项目, 不仅可以顺利编译 MonoTouch 项目的源文件, Resharper 也不再提示错误。
分类: Mono, iOS
MonoTouch绑定CocoaTouch类库
绑定概述
在 Windows/Linux 平台上, .Net/Mono 可以通过平台调用 (P/Invoke) 技术调用本地类库, 通过互操作 (Interop) 技术调用 COM 组件, 在 iOS 平台上, MonoTouch 也有类似的技术, 可以调用 iOS 的 CocoaTouch 类库, 这种技术在 MonoTouch 叫做绑定 (Binding) , 整个 monotouch.dll 就是用绑定技术完成的。互联网上有很多热心网友提供的 CacoaTouch 类库, 如果想使用这些类库, 完全用 C# 重写是不可取的, 所以就要用到 MonoTouch 的绑定技术。
绑定技术听起来高深, 其实仔细研究起来, 其实并不难。 接下来, 以 KKGridView 为例, 说明怎样绑定 CocoaTouch 类库项目。
准备 MonoTouch 绑定项目
新建一个名称为 KKGridView 的空白解决方案, 作为工作区, 再新建一个绑定项目, 名称为 Binding , 项目建好之后, 设置绑定项目的默认命名空间为 MonoTouch.KKGrid , 并设置项目的输出为 KKGridView , 相关截图如下:绑定项目默认结构如下, 包含两个文件: ApiDeginition.cs 和 StructsAndEnums.cs , 其中 ApiDefinition 用于绑定 CacoaTouch 类库定义的 interface 、 delegate 与 protocol 及其成员, 而 StructsAndEnums 用于绑定 ApiDefinition 所需的结构、 枚举以及其它。 这两个文件的编译方式是不同的, 所以对应的 C# 类型必须对号入座才行。
获取 KKGridView 源代码并编译
KKGridView 在 GitHub 上的主页是 https://github.com/kolinkrewinkel/KKGridView.git , 使用 git 可以轻松获取其源代码。 打开一个命令行窗口, 切换到绑定项目目录, 输入下面的命令:?
?
绑定 Objective-C 类型至 C#
绑定的语法定义为:?
interface
ObjC 的 interface 定义如下:
?
?
ObjC 的 protocol 定义语法如下:
?
?
?
实例方法绑定为对应的 C# 实例方法:
?
?
ObjC 中的 class method 与 C# 中的静态方法概念一致, 因此绑定为 C# 的静态方法, 例如:
?
ObjC 的属性通常由 setPropertyName 、 propertyName 两个方法组成, 绑定为 C# 的属性:
?
?
?
枚举的绑定是最容易的, 不过要放在 enums.cs 文件中, 例如:
?
添加 Makefile
?绑定项目源代码
KKGridView 的全部绑定源代码放在 GitHub , 地址为 https://github.com/beginor/MonoTouch.KKGridView , 有兴趣的可以围观。分类: Mono, iOS
相关文章推荐
- 让 VS 编译 MonoTouch 项目源文件不再出错
- 使用vs2015编译VTK INSTALL-仅用于项目-仅生成INSTALL出错解决方法
- 使用Cmake生成CEF的项目源文件,并在VS2015中编译通过
- 用VS.NET打开或创建web项目出错的解决办法
- 【Qt5 for VS】关于 VS2013+qt5.4.0 QSerialPort 编译时提示找不到外部符号,连接出错的解决方案【转载】
- 并行编译加快VS C++项目的编译速度
- 创建 Maven 项目编译出错
- VS2005.NET提示"试图运行项目时出错,无法启动调试,绑定句柄无效"解决办法
- VS2012新建项目出错:未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService
- 编译一个可以不依赖vs的release项目
- libtiff+opencv2.3.1+vs 2005 编译tiff出错
- VS2015 编译QT项目出现error MSB6006: “cmd.exe”已退出,代码为 3。
- libcurl在vs2013下C++项目中的编译连接
- 用VS打开Unity项目,编译遇到的坑
- android studio编译项目时出错
- VS 2010无法创建项目提示写入项目文件时出错 没有注册类别
- cocos2d-x项目与vs2013编译
- VS 2005 调试过程中不定期出现 ”试图运行项目时出错:无法启动调试。拒绝调试”的对话框的解决方法
- web项目编译出错时,原因之一,可能是build path 中order and Export引起
- 在VS项目中使用SVN版本号作为编译版本号