2016-12-06 12 views
2

У меня есть MyServiceLibrary.dll, который представляет несколько классов, таких как UserStorageService, Storage, User. Служба содержит хранилище и сохраняет пользователей в хранилище.Вызов метода экземпляра с помощью меток отражения TargetException.

Я создал новое консольное приложение с новым доменом приложения внутри него.

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: Объект не соответствует целевому типу.

В logfile я увидел, что был создан экземпляр UserStorageService. Я могу вызвать статический метод этого класса, но примеры метоз не работают.

ответ

0

Вы пытались использовать GetType, чтобы убедиться, что вы указали точный тип?

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