Xamarin.iOS 无法解析 System.ValueTuple
发生此错误的原因是与 Visual Studio 不兼容。
Visual Studio 2017 Update 1 (版本 15.1 或更高版本)仅与 System.ValueTuple NuGet 4.3.0 (或更早版本)兼容。
Visual Studio 2017 Update 2 (版本 15.2 或更高版本)仅与 System.ValueTuple NuGet 4.3.1 或更高版本兼容。
选择与 Visual Studio 2017 安装相对应的 System.ValueTuple NuGet。
收到“检索更新信息时出错”错误消息
尝试更新软件并显示此错误消息时,请尝试重启 IDE。 如果失败,请尝试注销,然后返回到 IDE 中的帐户。
如何实现使用接口生成器创建出口或操作?
有关在 IB 中使用出口和操作的详细信息,请参阅 Apple 的 出口 和 操作 指南。
System.Text.Encoding.GetEncoding 引发 NotSupportedException
你可能正在使用默认未添加的编码。 请查看“国际化”页,了解如何添加对更多编码的支持。
System.MissingMethodException (任何其他内容)
该成员可能已被链接器删除,在运行时不存在于程序集中。 此错误有多种解决方法:
- 将
[Preserve]
属性添加到成员。 此属性将阻止链接器删除它。 - 调用 mtouch 时,请使用 -nolink 或 -linksdkonly 选项:
- -nolink 禁用所有链接。
- -linksdkonly 将仅链接 Xamarin.iOS 提供的程序集(例如 xamarin.ios.dll),同时保留用户创建的程序集(即应用项目)中的所有类型。
程序集已链接,以便生成的可执行文件更小。 禁用链接可能会导致比预期更大的可执行文件。
你正在获取 ModelNotImplementedException
此异常意味着你正在调用基础。方法 () 重写 Model 的类。 无需为模型(使用 [Model] 属性标记的类)调用类中的基方法。
此类不符合密钥 XXXX 的键值编码
如果在加载 NIB 文件时收到此错误,则表示在托管类上找不到值 XXXX。 缺少如下所示的声明:
[Connect]
TypeName XXXX {
get {
return (TypeName) GetNativeField ("XXXX");
}
set {
SetNativeField ("XXXX", value);
}
}
上述定义由 Visual Studio for Mac 自动生成,用于添加到该文件中 NAME_OF_YOUR_XIB_FILE.designer.xib.cs
Visual Studio for Mac 的任何 XIB 文件。
此外,包含上述代码的类型必须是 NSObject 的子类。 如果包含类型位于命名空间中,则它还应具有 [Register] 属性,该属性提供没有命名空间的类型名称(因为 Interface Builder 不支持类型中的命名空间):
namespace Samples.GLPaint {
// The [Register] attribute overrides the type name registered
// with the Objective-C runtime, in this case removing the namespace.
[Register ("AppDelegate")]
public class AppDelegate {/* ... */}
}
Interface Builder 文件中未知的类 XXXX
在接口生成器文件中定义类,但不包括 C# 代码中的实际实现时,会发生此错误。
添加如下所示的代码:
public partial class MyImageView : UIView {
public MyImageView (IntPtr handle) : base (handle {}
}
System.MissingMethodException:找不到 Foo.Bar::ctor(System.IntPtr) 的构造函数
在运行时实例化从 Interface Builder 文件引用的类的实例时,会出现此错误。 此错误意味着缺少将单个 IntPtr 作为参数的构造函数。
具有 IntPtr 句柄的构造函数用于将托管对象与其非托管表示形式绑定。
若要修复此错误,请将以下代码行添加到类 Foo.Bar:
public Bar (IntPtr handle) : base (handle) { }
类型 {Foo} 不包含定义GetNativeField
,找不到 {Foo} 类型的扩展方法GetNativeField
如果在设计器生成的文件中收到此错误(*.xib.designer.cs),则表示以下两项之一:
1) 缺少分部类或基类
设计器生成的分部类必须在用户代码中具有相应的分部类,这些分部类通常UIViewController
继承自某些子类NSObject
。 确保为提供错误的类型具有此类。
2) 默认命名空间已更改
设计器文件是使用项目的默认命名空间设置生成的。 如果更改了这些设置或重命名了项目,则分部类中生成的命名空间可能会更改。 生成的分部类可能不再与其用户代码对应项位于同一命名空间中。
命名空间设置位于“项目选项”对话框中。 默认命名空间位于“常规主>设置”部分中。 如果项目为空,则项目的名称将用作默认值。 更高级的命名空间设置位于 “源代码->.NET 命名策略 ”部分中。
操作警告:永远不会使用专用方法“Foo”。 (CS0169)
接口生成器文件的操作在运行时通过反射连接到小组件,因此需要此警告。
如果要仅针对这些方法取消此警告,可以在操作周围使用“#pragma 警告禁用 0169”“#pragma 警告启用 0169”。 如果要为整个项目禁用它(不建议),请将 0169 添加到编译器选项中的“忽略警告”字段。
mtouch 失败并显示以下消息:无法打开程序集“/path/to/yourproject.exe”
如果看到此错误消息,通常问题在于项目的绝对路径包含空格。 此问题将在 Xamarin.iOS 的未来版本中修复。 可以通过将项目移动到没有空格的文件夹来解决此问题。
sqlite3 版本已旧 - 请升级到至少 v3.5.0!
当以下所有内容均为 true 时,将发生此消息:
- 在项目中引用 Mono.Data.Sqlite
- Mac 正在运行 macOS X Leopard (10.5)
- 在模拟器中运行应用。
问题是 Mono 正在选取 OS Xlibsqlite3.dylib
,而不是 i电话Simulator libsqlite3.dylib
的文件。 你的应用 将在 设备上工作,但不适用于你的模拟器。
部署到设备失败,出现 System.Exception:AMDeviceInstallApplication 返回3892346901
此错误意味着证书或捆绑 ID 的代码签名配置与设备上安装的预配配置文件不匹配。 确认在 Project Options-i>电话 Bundle Signing 中选择了适当的证书,以及 Project Options-i>电话 应用程序中指定的正确捆绑 ID。
代码完成在 Visual Studio for Mac 中不起作用
确保使用的是最新版本的 Visual Studio for Mac 和 Xamarin.iOS
如果问题仍然存在, 请提交 bug,附加 ~/Library/Logs/XamarinStudio-{VERSION}/Ide-{TIMESTAMP}.log、 AndroidTools-{TIMESTAMP}.log和 Components-{TIMESTAMP}.log 日志文件。
如果所有其他操作都失败,可以尝试删除代码完成缓存,以便重新生成代码:
[rm -r ~/.config/XamarinStudio-{VERSION}/CodeCompletionData]
请注意,正确键入此命令或意外删除重要文件。
复制文本时 Visual Studio for Mac 崩溃
常用的 Mac 实用工具 QuickSilver、Google Toolbar 和 LaunchBar 具有损坏 Visual Studio for Mac 内存的剪贴板功能。 在其选项中,可以将 Visual Studio for Mac 列为不应干扰的进程。
Visual Studio for Mac 抱怨需要 Mono 2.4
如果更新了 Visual Studio for Mac,并且尝试再次启动 Visual Studio for Mac,请升级 Mono 2.4 安装 ,将收到有关 Mono 2.4 不存在的消息。
Mono 2.4.2.3_6 修复了一些重要问题,这些问题阻止 Visual Studio for Mac 可靠运行,有时在启动时挂起 Visual Studio for Mac 或阻止生成代码完成数据库。
安装新的 Mono 后,Visual Studio for Mac 将按预期启动。
../../../../mono/metadata/generic-sharing.c:704,条件“oti”未满足
如果收到以下堆栈跟踪:
- Assertion at ../../../../mono/metadata/generic-sharing.c:704, condition `oti' not met
Stacktrace:
at System.Collections.Generic.List`1<object>..cctor () <0xffffffff>
at System.Collections.Generic.List`1<object>..cctor () <0x0001c>
at (wrapper runtime-invoke) object.runtime_invoke_dynamic (intptr,intptr,intptr,intptr) <0xffffffff>`
这意味着你将使用拇指代码编译的静态库链接到项目中。 在 i电话 SDK 版本 3.1(或更高版本)中,Apple 在将非 Thumb 代码(Xamarin.iOS)与 Thumb 代码(静态库)链接时在其链接器中引入了一个 bug。 需要链接到静态库的非 Thumb 版本,以缓解此问题。
System.ExecutionEngineException:尝试 JIT 编译方法(包装器托管到托管) Foo[]:System.Collections.Generic.ICollection'1.get_Count ()
后缀指示你或类库通过泛型集合(如 IEnumerable<>、ICollection<> 或 IList<>)对数组调用方法。 解决方法是,可以通过自己调用该方法来显式强制 AOT 编译器包含该方法。 请确保在触发异常的调用之前执行此代码。 在这种情况下,可以编写:
Foo [] array = null;
int count = ((ICollection<Foo>) array).Count;
这将强制 AOT 编译器包含get_Count方法。
Visual Studio for Mac 源编辑器速度非常慢
有时 Visual Studio for Mac 源编辑器变得极其缓慢,在键入字符之间似乎挂起了几秒钟。
此问题非常罕见,难以重现。 重启 Visual Studio for Mac 后,它通常不能在同一台计算机上重现。 出于此原因,如果可以在重启 Visual Studio for Mac 之前执行多个调试步骤,并将结果发送给我们,我们对此很感激。
- 请尝试关闭编辑器选项卡,然后重新打开它。 它需要一些编辑或移动插入点,直到经济放缓再次发生?
- 使用“硅调试”开发人员工具(可以使用聚焦找到)禁用“Beam 同步”,并检查源编辑器性能是否还原为正常状态。
- 尝试重复步骤(1),但梁同步仍处于禁用状态。
- 如果编辑器挂起了几秒钟,请尝试在挂起时在终端中运行“killall -QUIT [Visual Studio for Mac]”。 当编辑器挂起时,可能会很难让 kill 命令发生,但这样做至关重要。 该命令强制 Mono 将所有线程的堆栈跟踪写入 MD 日志。 我们可以使用日志来发现 Visual Studio for Mac 挂起时线程处于什么状态。
附加 XS 日志、~/Library/Logs/XamarinStudio-{VERSION}/Ide-{TIMESTAMP}.log、AndroidTools-{TIMESTAMP}.log和 Components-{TIMESTAMP}.log(在较旧版本的 XS/MonoDevelop 中,仅发送 ~/Library/Logs/MonoDevelop-(3.0|2.8|2.6)/MonoDevelop.log)。
注意
在 XS 2.2 Final 中修复了上述问题**
编译的应用程序非常大
为了支持调试,调试生成包含额外的代码。 内置于发布模式的项目是大小的一小部分。
从 Xamarin.iOS 1.3 开始,调试版本包括对 Mono 的每个组件(每个框架类中的每个方法)的调试支持。
使用 Xamarin.iOS 1.4,我们将引入一种更简单的调试方法。 默认值将为代码和库提供调试检测,而不是针对所有 Mono 程序集。 必须选择加入,为所有 Mono 程序集提供调试检测。
安装挂起
如果 i电话 模拟器正在运行,Mono 和 Xamarin.iOS 安装程序都挂起。 此问题不限于 Mono 或 Xamarin.iOS。 如果 i电话 模拟器在安装过程中正在运行,则此问题在所有软件中都尝试在 macOS Snow Leopard 上安装软件。
请确保退出 i电话 模拟器,然后重试安装。
调试器无法与设备连接
开始调试设备配置时,会看到调试器显示一个对话框,指示它正在尝试连接到应用程序。 调试器可能无法连接到应用程序的原因有多种,具体取决于用于连接的模式(USB 或 WiFi)。
如果设备和调试器主机位于不同的网络上,防火墙或专用网络可能会阻止应用程序在 WiFi 模式下连接到调试器主机。
Visual Studio for Mac 可能无法查询主机的正确 IP。 在 WiFi 模式下,Visual Studio for Mac 为应用程序提供它可以找到主机的所有 IP。 应用程序会尝试全部查看它是否可以使用其中任何一个连接到 Visual Studio for Mac。
另一台设备连接到主机上的 USB 端口。 在少数情况下,已知连接到主机上 USB 端口的其他设备会以某种方式干扰 USB 模式下的调试。
当 WiFi 或 USB 模式不起作用时,可以轻松尝试另一种模式。 在 Visual Studio for Mac 中,打开“首选项”,转到“首选项/调试器/i电话调试器”页,然后切换“通过 WiFi 而不是 USB 调试 iOS 设备”检查框。 如果两者都无效,可以在详细模式下查看设备控制台中的失败的详细信息(通过向项目选项中的其他 mtouch 参数添加“-v -v -v”来启用)。
错误 134:mtouch 失败并显示以下消息:
如果尝试在 Xamarin.iOS 1.4 版本的版本上使用 -nolink 进行生成,可能会引发此错误。 可以通过在 monodevelop 项目配置中指定 Extra Arguments 来解决此错误。
添加参数
-nosymbolstrip
应解决此问题。
Visual Studio for Mac 项目签名选项中未显示分发标识
Visual Studio for Mac 2.2 存在一个 bug,导致它无法检测包含逗号的分发证书。 更新到 Visual Studio for Mac 2.2.1。
上传过程中出现“AFCFileRefWrite 返回:1”错误
将应用上传到设备时,可能会收到错误“AFCFileRefWrite 返回:1”。 如果你有一个零长度的文件,则会发生此错误。
错误“mtouch 失败且无输出”
当存储解决方案或项目的项目名称或目录包含空格时,Xamarin.iOS 和 Visual Studio for Mac 的当前版本将失败。 解决方法:
- 确保项目及其存储的目录不包含任何空格。
- 在项目“主设置”中,请确保项目名称不包含任何空格。
错误“上传的二进制文件无效。 SDK 的预发行 beta 版本用于生成应用程序”
此错误通常是在 Xamarin.iOS 2.0.0 发布之前在 iPad 开发中启动的项目引起的。 Info.plist 中可能有一些密钥,例如:
<key>UIDeviceFamily</key>
<array>
<string>1</string>
</array>
应删除此密钥对,因为 Visual Studio for Mac 会自动处理它。
错误“SDK 的预发行 beta 版本用于生成应用”
(由埃德·安妮夫贡献)
执行以下步骤:
- 将 i电话 生成选项中的 SDK 版本更改为 3.2。 iTunes 连接将在上传时拒绝它,因为它看到使用 SDK 版本小于 3.2 生成的 iPad 兼容应用
- 为项目创建自定义 Info.plist,并将 MinimumOSVersion 显式设置为 3.0。 这将替代 Xamarin.iOS 设置的 MinimumOSVersion 3.2 值。 如果不执行此操作,应用将不会在 i电话 上运行。
- 重新生成、压缩并上传到 iTunes 连接。
未经处理的异常:System.Exception: 找不到 selector someSelector: on {type}
此异常由以下三项之一引起:
- 已向运行时提供选择器, Objective-C 而无需将相应的 [Export] 属性应用于方法
- 已启用完整链接,但未将 [Preserve] 属性应用于 [Export]ed 方法。
- 已将 [Export] 属性应用于继承类型的私有方法。
未更新MainWindow.xib.designer.cs文件
Xamarin Studio 2.4 中有一个 bug,导致它不会在新项目中将 MainWindow.xib 文件与 MainWindow.xib.designer 文件分组。 这意味着它不会更新该特定文件的设计器代码。
此问题已在 Visual Studio for Mac 版本中修复,使用内置更新程序升级到可用的最新版本。
可以通过删除 xib 及其设计器文件来修复现有项目,然后将其添加回。 文件将正确组合在一起。
创建后 UIAlertView 或 UIActionSheet 消失
如果有如下所示的代码:
var actionSheet = new UIActionSheet ("My ActionSheet", null, null, "OK", null){
Style = UIActionSheetStyle.Default
};
actionSheet.Clicked += delegate (sender, args){
Console.WriteLine ("Clicked on item {0}", args.ButtonIndex);
};
“actionSheet”对象作为函数中的临时变量生活。 函数终止后,该对象就有资格进行垃圾回收。 它最终在传递中被垃圾回收。
若要解决此问题,需要在方法外部保留对“actionSheet”的引用,该引用将位于方法之外的位置。
项目始终在 iPad 模拟器中运行
i电话 SDK 4.0 安装程序安装 2 个 SDK。 用于生成仅限 iPad 的应用的 3.2 SDK。 用于生成 i电话 和通用应用的 4.0 SDK。 它还安装一个 3.2 模拟器,该模拟器仅模拟 iPad,以及模拟 i电话 或 i电话 4 的 4.0 模拟器。 删除所有较旧的 SDK 和模拟器。
Visual Studio for Mac i电话项目生成选项包括将用于生成应用的 SDK 版本的设置。 可以在 Project Options-Build-i>>电话 Build 中找到此设置。
Visual Studio for Mac 中的新项目使用最早安装的 SDK 作为其默认 SDK 设置。 如果指定的 SDK 不存在,Visual Studio for Mac 将使用最接近的 SDK 来生成应用。 这样做是为了使项目并不总是需要最新的 SDK。 但是,这当前会导致使用 3.2 SDK - 这会导致 iPad 模拟器使用。
若要使用 4.0 SDK 解决此问题,请转到 Project Options-Build-i>>电话 生成>并使用下拉框将 SDK 值更改为“4.0”。 必须使用面板顶部的下拉列表访问的每个配置和平台组合进行此更改。
SDK 版本不应与“最低 OS 版本”设置混淆。 此值不必与 SDK 版本值匹配 - 它会影响应用将安装到的操作系统的最低版本(可能早于 SDK),前提是仅使用旧版 OS 中存在的 API,或者保护使用运行时 OS 版本检查的较新功能。 将其设置为测试应用的最旧操作系统版本。
Project-i>电话 模拟器目标>菜单可用于选择在运行或调试项目时默认使用的模拟器。 此外,“运行>方式>”菜单还可用于选取要运行的特定模拟器。
ibtool 返回错误 133
此错误表示已安装 XCode 4。 在 XCode 4 中,已删除 ibtool。 不再可以使用独立工具编辑 XIB 文件。
如果要使用 ibtool,请安装可从 Apple 网站获取的 XCode 系列 3。
“无法为 mime 类型创建显示绑定:application/vnd.apple-interface-builder”
如果尝试从非 i电话 项目创建 i电话 UI,则会发生此错误。 请确保从 i电话/iPad 解决方案开始,无法将 i电话 UI 元素添加到非 i电话/iPad 项目。
在 iOS 模拟器内执行时启动崩溃
如果在模拟器内出现运行时崩溃(SIG标准版GV),以及如下所示的堆栈跟踪:
at (wrapper managed-to-native) System.Reflection.Assembly.GetTypes (System.Reflection.Assembly,bool)
at MonoTouch.ObjCRuntime.Runtime.RegisterAssembly (System.Reflection.Assembly)
at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr)
...然后,模拟器应用程序目录中可能有一个(或更多)过时的程序集。 此类程序集可能存在,因为 Apple iOS 模拟器会添加和更新文件,但永远不会删除它们。 最简单的解决方案是选择“重置和内容和设置...”从模拟器菜单。
警告
这将从模拟器中删除所有文件、应用程序和数据。 下次执行应用程序时,Visual Studio for Mac 会将其部署到模拟器中,并且不会有旧的过时程序集导致崩溃。
模拟器在应用程序安装过程中挂起
当应用程序名称包含“.”时,可能会出现此错误。(点) 以他们的名字命名。 使用“.”(dot) 在可执行名称中不允许在 CFBundleExecutable 中 - 即使它在许多其他情况下(如设备)工作也是如此。
“该值不应在名称中包含任何扩展。
错误:双击.xib 文件时“不支持自定义属性类型0x43”
当环境变量设置不正确时,尝试打开 .xib 文件会导致此消息。 使用 Visual Studio for Mac 和 Xamarin.iOS 时,不应发生此错误。 从 /Applications 重新打开 Visual Studio for Mac 应解决此问题。
尝试更新软件并显示此错误消息时,电子邮件 support@xamarin.com
应用程序在模拟器上运行,但在设备上失败
此问题可以以多种形式显示,并且并不总是产生一致的错误。 如果应用程序包含 .xib,检查以确保 .xib 上的生成操作设置为 InterfaceDefinition。 这是 .xibs 的默认生成操作。
若要检查生成操作,请右键单击 .xib 文件,然后选择“生成操作”。
System.NotSupportedException:没有数据可用于编码 437
在 Xamarin.iOS 应用中包括第三方库时,尝试编译和运行应用时,可能会收到“System.NotSupportedException: 没有数据可用于编码 437”格式的错误。 例如,库(例如 Ionic.Zip.ZipFile
)可能会在操作期间引发此异常。
可以通过打开 Xamarin.iOS 项目的选项来解决此异常,转到 iOS 生成>国际化并检查西部国际化。
无法启动 Xamarin.Launcher 找不到可执行文件“mlaunch.exe”
在某些情况下,防病毒软件可能会错误地将 Xamarin.iOS SDK 标记为恶意软件并删除所需的文件,从而损坏 SDK。 这将导致错误,例如“无法启动 Xamarin.Launcher 找不到可执行文件”mlaunch.exe”。
如果受到影响,请从防病毒扫描程序中排除mlaunch.exe以防止重复。 有关详细信息,请参阅 如何使用 Symantec Endpoint Protection 创建应用程序控制异常或停止sysfer.dll注入进程,以及 从诺顿自动保护、SONAR 和下载智能扫描 中排除文件和文件夹。 此外,请考虑向 Symantec 或 诺顿报告误报。
为mlaunch.exe添加排除项后,需要重新安装才能还原缺失的文件。 只需切换更新程序中的通道即可重新安装:
- Visual Studio 菜单 >“检查更新”。
- 在下拉列表中选择其他更新通道,然后按 “切换通道 ”按钮。
- 等待更新下载。
- 切换回原始通道并安装更新。
如果这些说明无法解决问题,请向以下 GitHub 问题添加注释: 8736。