“启用32位应用程序”设置为false的无效程序异常

时间:2013-09-06 20:48:59

标签: .net reflection.emit

我正在生成自己的代理,它包装从MongoDB返回的对象。代理实现了一个接口:

interface IProxy
{
    string __ID {get;}
}

代理生成器使用以下代码生成实现

PropertyBuilder proxyID = typeBuilder.DefineProperty("__ID", PropertyAttributes.None, typeof(string), null);
proxyID.SetCustomAttribute(new CustomAttributeBuilder(typeof(Root.Attributes.DataAnnotations.NotMappedAttribute).GetConstructor(Type.EmptyTypes), new object[0]));
 MethodBuilder proxyID_PropertyGet = typeBuilder.DefineMethod("get___ID", MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, typeof(string), Type.EmptyTypes);
 ILGenerator __IDILget = proxyID_PropertyGet.GetILGenerator();
 __IDILget.Emit(OpCodes.Ldarg_0);
 __IDILget.Emit(OpCodes.Ldfld, objectID);
 __IDILget.Emit(OpCodes.Callvirt, typeof(ObjectId).GetMethod("ToString", BindingFlags.Public | BindingFlags.Instance));
 __IDILget.Emit(OpCodes.Ret);
 proxyID.SetGetMethod(proxyID_PropertyGet);

应用程序使用"任何CPU"编译。组态。

使用Visual Studio Web服务器在我们的开发机器上运行时,应用程序运行正常。

在IIS7.5(Windows 2008 R2)上运行时,只要访问__ID属性,就会抛出无效的程序异常。更改"启用32位应用程序"设置为true会更改此行为。

我不想修改IIS配置。为什么异常只会在64位应用程序中抛出?

1 个答案:

答案 0 :(得分:0)

事实证明,调用字段ToString()是一个结构,因此IL必须更改为:

ILGenerator __IDILget = proxyID_PropertyGet.GetILGenerator();
__IDILget.Emit(OpCodes.Ldarg_0);
__IDILget.Emit(OpCodes.Ldflda, objectID);
__IDILget.Emit(OpCodes.Constrained, typeof(ObjectId));
__IDILget.Emit(OpCodes.Callvirt, typeof(ObjectId).GetMethod("ToString", BindingFlags.Public | BindingFlags.Instance));
__IDILget.Emit(OpCodes.Ret);
proxyID.SetGetMethod(proxyID_PropertyGet);