我已经意识到我无法直接将仅反射加载的程序集中的类型与typeof
解析的类型进行比较,即使它们都来自同一个程序集。
我目前正在使用:
reflectionOnlyType.AssemblyQualifiedName == type.AssemblyQualifiedName
。
推荐的方式是什么?
答案 0 :(得分:1)
这可能不是一个明确的答案,但它比评论中的内容要好一些。
刚刚问自己同样的问题,我确实从AQN等效开始作为第一步。问题在于,如果程序集未签名,则使用相同的AQN进行重复程序集是微不足道的。 (注意,我不是来自安全方面;如果您正在加载程序集,则不应该依赖此答案来防止在您的应用程序中执行错误代码)
另一种选择是使用Type.GUID
,some random people on the internet say是确定性生成的,但包含可由程序员控制的Type的属性。因此,碰撞的可能性仍然存在。 (这不应该用于安全目的)
似乎没有比上述更好的选择(如果我错了,请回答!)。如果您正在反映并从同一文件夹(例如,您的bin文件夹)加载,那么使用AQN就足够了。 Type.GUID
为碰撞提供了更好的保护,并且感觉比使用字符串比较感觉更好。
如果你真的真的需要知道,你可能不得不过分,比较两个包含程序集的加密哈希来验证它们是否相同,然后使用AQN比较和可能的其他属性类型。
答案 1 :(得分:1)
我通过使用我拥有的运行时类型加载System.ReflectionOnly
类型来解决它。这似乎是最安全的方式:
// Comes from an assembly loaded as reflection only
var reflectionOnlyTypeFromSomeAssembly = GetItFromSomewhere();
// Comes from an assembly that is running
var reflectionOnlyTypeFromRuntimeType =
Type.ReflectionOnlyGetType(typeof(myType).AssemblyQualifiedName, false, true);
// Now you can compare
if (reflectionOnlyTypeFromSomeAssembly == reflectionOnlyTypeFromRuntimeType)
{
// do something?
}