我正在开发一款适用于Iphone的Xamarin应用程序,类似应用程序的Android版本已准备好进行Google游戏。我在我的应用程序中使用jabber-net库进行聊天功能。但在设备上有一些问题(Iphone 5 - IOS 7.0.3)。在模拟器中不会发生此问题以下是方法代码。
public class QnameType
{
/// <summary>
/// Element name
/// </summary>
protected internal string Name;
/// <summary>
/// Element namespace URI
/// </summary>
protected internal string NS;
/// <summary>
/// Type to create for NS/Name pair
/// </summary>
protected internal Type ElementType;
/// <summary>
/// Create a QnameType
/// </summary>
/// <param name="name"></param>
/// <param name="ns"></param>
/// <param name="typ"></param>
public QnameType(string name, string ns, Type typ)
{
this.Name = name;
this.NS = ns;
this.ElementType = typ;
}
/// <summary>
/// Is this the same qname by element name and namespace?
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public override bool Equals(object obj)
{
if (obj == (object)this)
return true;
QnameType other = obj as QnameType;
if (other == null)
return false;
return (other.Name == Name) && (other.NS == NS);
}
/// <summary>
/// Get a hash over the name and namespace.
/// </summary>
/// <returns></returns>
public override int GetHashCode()
{
return ToString().GetHashCode();
}
/// <summary>
/// Namespace|Name
/// </summary>
/// <returns></returns>
public override string ToString()
{
return NS + "|" + Name;
}
}
public interface IPacketTypes
{
/// <summary>
/// QName to type mappings.
/// </summary>
QnameType[] Types { get; }
}
public class ElementFactory
{
private Hashtable m_types = new Hashtable();
private static readonly Type[] s_constructorTypes =
new Type[] { typeof(string),
typeof(XmlQualifiedName),
typeof(XmlDocument) };
public void AddType(IPacketTypes list)
{
foreach (QnameType qn in list.Types)
{
this.AddType(qn.Name, qn.NS, qn.ElementType);
}
}
public void AddType(string localName, string ns, Type t)
{
Debug.Assert(t.IsSubclassOf(typeof(Element)));
ConstructorInfo ci = t.GetConstructor(s_constructorTypes);
Debug.Assert(ci != null);
AddType(new XmlQualifiedName(localName, ns), ci);
}
public Element GetElement(string prefix, XmlQualifiedName qname, XmlDocument doc)
{
ConstructorInfo ci = (ConstructorInfo) m_types[qname];
if (ci == null)
{
return new Element(prefix, qname, doc);
}
return (Element) ci.Invoke
(new object[] {prefix, qname, doc});
}
/// <summary>
/// Get a constructor for the appropriate type for the given qname.
/// </summary>
public ConstructorInfo this[XmlQualifiedName qname]
{
get { return (ConstructorInfo) m_types[qname]; }
}
}
.GetConstructor()在Iphone上返回null但在模拟器上运行正常。
编辑:添加了更多详细信息,
任何帮助都将受到高度赞赏。
由于
答案 0 :(得分:2)
这可能是正常的,取决于t
本身 - 它代表什么类型?
默认情况下,模拟器版本上的托管链接器被禁用(不链接)。这意味着每种类型都将成为应用程序的一部分。
但是,设备构建的默认设置为 Link SDK 。这意味着从应用程序中删除了未使用的类型(使用静态分析找到)。这允许减小应用程序的大小(通过不在每个应用程序内编译/运送整个.NET BCL)。
静态分析无法找到检测代码的动态使用,例如反射。如果您的应用程序依赖于反射,则需要保留代码:使用[Preserve]
属性,XML文件或添加一些额外的代码,这些代码将为链接器提供提示以保留所需的成员
有关详细信息,请参阅documentation。
答案 1 :(得分:0)
除了poupou的答案:
如果由于Unity3D存在类似问题而在这个问题上遇到麻烦,请浏览以下页面:https://docs.unity3d.com/Manual/IL2CPP-BytecodeStripping.html
通常,该页面向您展示如何确保所有内容都包含在IL2CPP版本中:
[Preserve]
关键字或
link.xml
文件