(new Object [xxx])。GetType()和typeof(Object [])在内存中加载CustomMarshalers.dll后返回不同的类型

时间:2011-11-10 16:26:18

标签: .net com clr

(new Object [xxx])。在CustomMarshalers.dll加载到内存后,GetType()开始返回不同的Type对象。

它返回一个Type对象,该对象在mscorlib.dll中引用相同的元数据记录,但它的Type.Guid字段填充了{9fa4230f-db51-34dd-b578-9c072c062046}值。

它使用下一个语法“variable.GetType()== typeof(object [])”来破坏任何检查变量类型的代码。因此,它破坏了mscorlib.dll中的二进制反序列化程序。这反过来会破坏WinForms中的许可证验证。这反过来打破了整个应用程序。

背景:

我有一个非托管桌面应用程序,它加载并执行一组实现预定义COM接口的.NET对象。应用程序作为通常的非托管程序启动。然后,它会发现需要加载,加载它们并执行预定义合同的COM对象列表。其中一些COM对象是在.NET中实现的。

.NET代码可以正常运行,直到CustomMarshalers.dll加载到内存中。在CustomMarshalers.dll加载到内存后,.NET代码开始失败。

CustomMarshalers.dll被加载,因为应用程序使用vbscript.dll执行VB6脚本(它是与启动期间加载的那些模块的单独活动)。该脚本使用基于.NET的COM对象,该对象向脚本返回一些值。我认为.NET会将CustomMarshalers.dll加载到内存中来封送这些值。

其他信息:

属性AssemblyQualifiedName,ContainsGenericParameters,FullName,Namespace,如果在使用(new object [xxx])接收的Type对象上调用其中任何一个,则抛出NullReference异常.GetType()。除Guid属性之外的所有其他内容在两个Type对象上完全相同。

0 个答案:

没有答案