[笔记][Unity3D]在dll中调用Assembly:CreateInstance报错--Default constructor not found

924 阅读1分钟

原因1:

PlayerSettings.stripEngineCode = true;

这是由于il2cpp的dll剥离所致。 执行上方的方法后,如果只通过CreateInstance实例化了一个类,则其构造函数只能通过反射进行引用,而链接器无法检测到该反射,因此将删除该构造函数。 解决方案是提供一个link.xml文件,告诉剥离程序不要剥离该构造函数。

原因2:

il2cpp打包方式时,不能通过以下方式获得当前的AssemblyType

Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集 

需要遍历所有的AssebliesTypes来获得

public static Type FindClass(string assemblyName, string className)
{
    foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
    {
        if (!String.IsNullOrEmpty(assemblyName))
        {
            if (assembly.GetName().Name == assemblyName)
            {
                return Type.GetType(className + ", " + assembly.FullName);
            }
        }
        else
        {
            // Search for the first instance of a class matching this name in all assemblies.
            foreach (var type in assembly.GetTypes())
            {
                if (type.FullName == className)
                {
                    return type;
                }
            }
        }
    }
    return null;
}