VB.NET应用32位转64位后出现类型转换异常求助
问题背景
- 应用采用三层架构:VB.NET独立应用程序、Broker Service、WCF Service
- 调用流程:VB.NET独立应用调用Broker Service,Broker Service再调用WCF Service连接数据库
- 所有项目已转换为64位并发布到Web服务器,32位模式运行正常,64位模式运行时抛出异常
核心错误信息
System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System.InvalidCastException: 无法将类型为“NavigatorMD.Core.Broker.CurrentUserSerializable”的对象强制转换为类型“NavigatorMD.BusinessLogic.CurrentUserSerializable”。
完整错误堆栈
System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System.InvalidCastException: 无法将类型为“Project.Core.Broker.CurrentUserSerializable”的对象强制转换为类型“Project.BusinessLogic.CurrentUserSerializable”。
在 Project.Core.ServiceProxy.GetUserInfo(String productId) 位置 D:\GitHub Source codes\Prj_D180 - Devexpress 18 - Copy\Core\Data Objects\ServiceProxy.vb:行号 934
在 Project.Core.CurrentUser.GetUserInfo(ApplicationMap& _applicationMap) 位置 D:\GitHub Source codes\Prj_D180 - Devexpress 18 - Copy\Core\Data Objects\CurrentUser.vb:行号 471
在 Project.Core.CurrentUser.AuthenticateUser(String LicenseKey, ApplicationMap& _applicationMap) 位置 D:\GitHub Source codes\Prj_D180 - Devexpress 18 - Copy\Core\Data Objects\CurrentUser.vb:行号 261
在 Project.MainForm.IsUserAuthenticated() 位置 D:\GitHub Source codes\Prj_D180 - Devexpress 18 - Copy\Project\MainForm.vb:行号 347
在 Project.MainForm..ctor() 位置 D:\GitHub Source codes\Prj_D180 - Devexpress 18 - Copy\Project\MainForm.vb:行号 182
--- 内部异常堆栈跟踪的结尾 ---
在 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
在 System.Reflection.RuntimeConstructorInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
在 Microsoft.Practices.ObjectBuilder.CreationStrategy.InitializeObject(IBuilderContext context, Object existing, String id, ICreationPolicy policy)
在 Microsoft.Practices.ObjectBuilder.CreationStrategy.BuildUpNewObject(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
在 Microsoft.Practices.ObjectBuilder.CreationStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
在 Microsoft.Practices.ObjectBuilder.ReflectionStrategy1.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild) 在 Microsoft.Practices.ObjectBuilder.ReflectionStrategy1.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
在 Microsoft.Practices.ObjectBuilder.ReflectionStrategy1.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild) 在 Microsoft.Practices.ObjectBuilder.SingletonStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild) 在 Microsoft.Practices.ObjectBuilder.TypeMappingStrategy.BuildUp(IBuilderContext context, Type t, Object existing, String id) 在 Microsoft.Practices.ObjectBuilder.BuilderBase1.DoBuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies)
在 Microsoft.Practices.ObjectBuilder.BuilderBase1.BuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies) 在 Microsoft.Practices.CompositeUI.Collections.ManagedObjectCollection1.BuildFirstTimeItem(Type typeToBuild, String idToBuild, Object item)
在 Microsoft.Practices.CompositeUI.Collections.ManagedObjectCollection1.Build(Type typeToBuild, String idToBuild, Object item) 在 Microsoft.Practices.CompositeUI.Collections.ManagedObjectCollection1.AddNewTTypeToBuild
在 Microsoft.Practices.CompositeUI.CabShellApplication2.OnRootWorkItemInitialized() 在 Microsoft.Practices.CompositeUI.BuilderStrategies.RootWorkItemInitializationStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild) 在 Microsoft.Practices.CompositeUI.BuilderStrategies.CommandStrategy.BuildUp(IBuilderContext context, Type t, Object existing, String id) 在 Microsoft.Practices.CompositeUI.BuilderStrategies.EventBrokerStrategy.BuildUp(IBuilderContext context, Type t, Object existing, String id) 在 Microsoft.Practices.ObjectBuilder.MethodExecutionStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild) 在 Microsoft.Practices.ObjectBuilder.PropertySetterStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild) 在 Microsoft.Practices.ObjectBuilder.CreationStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild) 在 Microsoft.Practices.ObjectBuilder.ReflectionStrategy1.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
在 Microsoft.Practices.ObjectBuilder.ReflectionStrategy1.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild) 在 Microsoft.Practices.ObjectBuilder.ReflectionStrategy1.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
在 Microsoft.Practices.ObjectBuilder.SingletonStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
在 Microsoft.Practices.ObjectBuilder.TypeMappingStrategy.BuildUp(IBuilderContext context, Type t, Object existing, String id)
在 Microsoft.Practices.ObjectBuilder.BuilderBase1.DoBuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies) 在 Microsoft.Practices.ObjectBuilder.BuilderBase1.BuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies)
在 Microsoft.Practices.CompositeUI.WorkItem.BuildUp()
在 Microsoft.Practices.CompositeUI.CabApplication`1.Run()
在 Project.MainProg.Main() 位置 D:\GitHub Source codes\Prj_D180 - Devexpress 18 - Copy\Project\MainProgram.vb:行号 14
相关源代码
Public Shared Function GetUserInfo(ByVal productId As String) As CurrentUserSerializable Dim args(6) As Object SetupArgs(args) args(0) = "getuserinfo" args(4) = args(3) args(5) = productId Dim retVal As Object = BrokerService.ProcessRequest(args, False) Return CType(retVal, CurrentUserSerializable) End Function Public Function ProcessRequest(ByRef args() As Object, ByVal noConnectionStringNeeded As Boolean) As Object Dim inValue As Broker.ProcessRequestRequest = New Broker.ProcessRequestRequest() inValue.args = args inValue.noConnectionStringNeeded = noConnectionStringNeeded Dim retVal As Broker.ProcessRequestResponse = CType(Me,Broker.IBroker).ProcessRequest(inValue) args = retVal.args Return retVal.ProcessRequestResult End Function
怀疑方向
怀疑GetUserInfo()函数未返回正确类型的值,导致强制转换失败。
内容的提问来源于stack exchange,提问作者Harsha W

