У меня есть 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. Я могу вызвать статический метод этого класса, но примеры метоз не работают.