Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法

简介: Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法

🟥 关于asmdef、DLL的特殊注意事项

若你要反射的脚本所在的文件夹或上层节点中含有asmdef,此时调用反射代码会报如下错误:

ArgumentException: Type cannot be null.


你添加了Assembly Definition Reference,此时运行正常了。但如果你将C#文件打包成DLL,又会报上面的错误。

DLL不支持直接直接使用 Type.GetType。


因此不要尝试网上的教程了,直接按照本文的最终方案来吧。


🟧GetType多平台方法

private Type GetType(string typeName)
    {
        var type = Type.GetType(typeName);
        if (type != null) return type;
        foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
        {
            type = a.GetType(typeName);
            if (type != null)
                return type;
        }
        return null;
    }


🟧反射属性

private void SetProperty(string className, string propertyName, object value)
    {
    //SKODE.Test:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("SKODE.Test");
        Component tarComponent = gameObject.GetComponent(tarClass);
        PropertyInfo tarProperty =
            tarClass.GetProperty("hi", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        //将 tarComponent 组件的 tarProperty属性 设置为 true
        tarProperty.SetValue(tarComponent, true);
    }


🟨反射变量

private void SetField()
    {
        //SKODE.Test:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("SKODE.Test");
        Component tarComponent = gameObject.GetComponent(tarClass);
        FieldInfo tarField =
            tarClass.GetField("hii", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        //将 tarComponent 组件的 tarField变量 设置为 true
        tarField.SetValue(tarComponent, true);
    }


🟩反射方法

private void CallMethod()
    {
        //SKODE.Test:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("SKODE.Test");
        Component tarComponent = gameObject.GetComponent(tarClass);
        MethodInfo tarMethod =
            tarClass.GetMethod("Call", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        //调用 tarComponent 组件的 tarMethod方法,并传入参数 parameters。
        //若不需要传入参数,则传入null即可。
        object[] parameters = { true };
        tarMethod.Invoke(tarComponent, parameters);
    }


🟦 反射重载方法

在反射重载方法时,如果调用此重载方法,会产生"发现不明确的匹配"的错误。

AmbiguousMatchException: Ambiguous match found.


解决方案如下:

GetMethod("MethodName", new Type [] { typeof(参数类型)});

其中type数组中的项的个数是由要调用的方法的参数个数来决定的。

如果无参数,则new Type[]{},使Type数组中的项个数为0。


1️⃣ 被调用的方法


2️⃣ 反射方法

private void CallVirtualMethod()
    {
        //Doozy.Runtime.UIManager.Containers.UIContainer:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("Doozy.Runtime.UIManager.Containers.UIContainer");
        Component tarComponent = GetComponent(tarClass);
        MethodInfo tarMethod = tarClass.GetMethod("Hide", new Type[] { });
        tarMethod.Invoke(tarComponent, null);
    }


相关文章
|
语音技术 开发工具 图形学
Unity与IOS⭐一、百度语音IOS版Demo调试方法
Unity与IOS⭐一、百度语音IOS版Demo调试方法
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
2523 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
存储 网络安全 数据库
YashanDB加密方法
YashanDB加密方法
|
算法 安全 数据安全/隐私保护
链接加密的方法有哪些?
【10月更文挑战第6天】链接加密的方法有哪些?
1563 10
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
安全 数据安全/隐私保护 开发者
保护敏感数据:使用Python加密数据的实用方法
保护敏感数据是一项基本的安全实践,Python通过上述库提供了强大的加密工具来实现这一目标。选择哪种方法取决于具体的应用场景和安全需求:对称加密(如AES)适合快速处理大量数据,而非对称加密(如RSA)更适合安全地交换密钥或进行身份验证。哈希函数则用于验证数据的完整性和一致性。通过合理使用这些技术,开发者可以大大增强其应用程序的安全性。
819 0
|
JavaScript 前端开发 安全
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
308 5
|
图形学 开发者
【Unity小技巧】unity移动物体的探究——使用8个不同方法
【Unity小技巧】unity移动物体的探究——使用8个不同方法
2170 1
|
数据安全/隐私保护 算法 安全
数据加密有哪些方法?
【6月更文挑战第2天】数据加密有哪些方法?
1531 3