Unity运行时使用的程序集和Editor下是不一样的。同样的一行代码在MonoBehaviour下输出的结果和通过Editor的输出是不一样的。
点击“Play”按钮,Unity运行期间,上句的执行结果为:
Assembly.GetExecutingAssembly: Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
上句如果在Editor里执行,点击编辑栏,得到:
Assembly.GetExecutingAssembly: Assembly-CSharp-Editor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
运行时和Editor模式下使用程序集的不一致会带来什么影响呢? 第一反应是反射的使用会受到影响。我们在非Editor下写的Class等,在Editor里可能没法直接找到。
例如,
https://msdn.microsoft.com/zh-cn/library/w3f99sx1(v=vs.110).aspx
public static Type GetType(
string typeName
)
通过函数Type.GetType(string),知道一个Class的文本名称,我们能获取这个Type进而知道这个Class的所有信息。
但Type的各种用法限定于同Assembly。如果我们想在Editor代码里通过一个非Editor的Class的文本名称获取这个Type,需要特殊处理。
我的方法是遍历Assembly,通过Assembly获取Type。
https://msdn.microsoft.com/zh-cn/library/y0cd10tb(v=vs.110).aspx
public virtual Type GetType(
string name
)
//have to traverse all assemblies to get the Type. In Assembly-CSharp-Editor you can not Get the Type
Type t = null;
foreach (var asm in AppDomain. CurrentDomain.GetAssemblies ())
{
Type tt = asm.GetType( properTypeName);
if (tt != null)
{
t = tt ;
break;
}
}