使用反射调用实例方法会引发 TargetException。

Posted

技术标签:

【中文标题】使用反射调用实例方法会引发 TargetException。【英文标题】:The calling of an instance method by using reflection throws TargetException. 【发布时间】:2016-12-06 06:52:17 【问题描述】:

我有 MyServiceLibrary.dll,它代表几个类,例如 UserStorageService、Storage、User。该服务包含一个存储并将用户保存到存储中。

我创建了一个新的控制台应用程序,其中包含新的应用程序域。

AppDomain masterDomain = AppDomain.CreateDomain("servicedomain");
string serviceLibraryPath = @"G:\Git\Service";
Assembly serviceAssembly = Assembly.LoadFrom(serviceLibraryPath);

在这里我得到了我使用的所有类型。

Type userType = serviceAssembly.GetType("MyServiceLibrary.User");
Type storageType = serviceAssembly.GetType("MyServiceLibrary.UserStorage");
Type userStorageServiceType = serviceAssembly.GetType("MyServiceLibrary.UserStorageService");

这些类型的新实例被创建到 masterDomain。

var storage = masterDomain.CreateInstanceFromAndUnwrap(serviceLibraryPath, storageType.FullName);

var user = masterDomain.CreateInstanceFromAndUnwrap(serviceLibraryPath, userType.FullName);

var userStorageService = masterDomain.CreateInstanceFromAndUnwrap(
                    serviceLibraryPath, // assemblyFile 
                    userStorageServiceType.FullName, // typeName                                                           
                    false, // ignoreCase                                                        
                    BindingFlags.CreateInstance, // bindingAttr                                                                
                    default(Binder), // binder                                                            
                    new object[] storage, // args                                                                 
                    CultureInfo.CurrentCulture, // culture                                                                 
                    new object[]  // activationAttributes
            );

我使用的所有类型都继承自 MarshalByRefObject 类。 现在我想添加我的新用户。

MethodInfo addMethod = userStorageServiceType.GetMethod("Add");
addMethod.Invoke(userStorageService, new object[]  user );

我遇到了一个异常:

TargetException:对象与目标类型不匹配。

在日志文件中,我看到创建了 UserStorageService 的实例。我可以调用这个类的静态方法,但是实例方法不起作用。

【问题讨论】:

【参考方案1】:

您是否尝试使用 GetType 来确保您反映了确切的类型?

userStorageService.GetType().GetMethod("Add")

【讨论】:

以上是关于使用反射调用实例方法会引发 TargetException。的主要内容,如果未能解决你的问题,请参考以下文章

VS2010 F5调试时出现:“ 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常”解决

使用反射从新实例 (reflect.New) 调用方法

反射生成对象,调用对象方法

通过反射调用动态调用方法

使用反射调用静态方法

如何利用java的反射机制动态创建对象