Type.GetConstructor在Iphone上返回null

时间:2013-11-21 11:49:34

标签: c# ios xamarin.ios xamarin.android xamarin

我正在开发一款适用于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但在模拟器上运行正常。

编辑:添加了更多详细信息,

任何帮助都将受到高度赞赏。

由于

2 个答案:

答案 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文件