Сценарий, идет как это -объекты класса Passing через различные версии сборки
- У меня есть сборка сказать «MyAssembly». Интерфейс «IMyInterface» определен в этой сборке.
- В той же сборке, у меня есть один класс (MyClass) с методом определения в нем, как:
общественной ничтожной MyMethod (IMyInterface объект) {}
- Теперь в моем project, я создал интерфейс с тем же именем и точными свойствами, которые были открыты интерфейсом «IMyInterface» в «MyAssembly».
- У меня есть класс, который расширяет этот интерфейс (тот, который я создал в моем проекте), и я хочу передать объект этого класса в качестве параметра методу «MyMethod» в другой сборке с использованием отражения.
Проблема есть -
- Когда я пытаюсь вызвать метод с помощью отражения, я получил это исключение, которое «Не удается преобразовать объект к типу IMyInterface».
код -
Assembly myAssembly = Assembly.LoadFrom("MyAssembly");
object classObject = myAssembly.CreateInstance("MyClass");
Type classType = myAssembly.GetType("MyClass");
MethodInfo myMethod = classType.GetMethod("MyMethod", BindingFlags.Instance);
// Creating an object of class in the latest assembly and need to pass this
// to method in assembly with different version.
ClassExtendingMyInterface obj= new ClassExtendingMyInterface();
myMethod.Invoke(classObject, new object[] { obj});
Если я получаю это правильно, это происходит потому, что объект, созданный в другой сборке и параметр, ожидаемый методом является его собственной сборки.
Другой подход, о котором я думал, заключался в том, чтобы создать свой собственный динамический метод в классе, который примет объект моего класса.
Я попытался Google для и попадались через Reflection.Emit или RunSharp динамически создать свой собственный класс. Но мы можем использовать это только в наших динамически сгенерированных сборках, но не можем создавать динамические методы или класс в уже существующей сборке.
Я знаю, что сборка сборок во время выполнения - это не очень хороший подход. Но сейчас я ничего не могу придумать. Спасибо за любую помощь.
> Намного проще просто использовать существующую сборку, не должно быть проблем в вашем потому что вы используете только интерфейс. Но я хочу свою собственную реализацию (способ реализации этого интерфейса) и хочу, чтобы этот объект был передан. Но поскольку эта реализация не может быть в существующей сборке, поскольку она уже развернута Не могу изменить эту сборку :(Вот почему я пытался реализовать ее в новой версии сборки и передал ее как параметр через отражение. Могу ли я достичь этого каким-то другим способом, если вы можете помочь .. спасибо .. :) –
Я не понимаю, почему это проблема, просто используйте копию развернутой сборки и добавьте ее в качестве ссылки на ваш проект. для взломов. –
Я не могу добавить ссылку на assmebly, так как мне нужно загрузить сборку во время выполнения в зависимости от некоторых случаев использования. Мне нужно загрузить сборку на основе некоторых пользовательских сценариев .. :( –