Возникли проблемы с приведением класса, созданного с помощью отражения - PullRequest
2 голосов
/ 24 февраля 2012

Я пытаюсь создать класс из сборки, известной только во время выполнения. Странные проблемы.

string providerType = AppConfig.GetConfigValue("LocationProvider");
string assemblyFileName = AppConfig.GetConfigValue("LocationProviderAssembly");
Assembly assembly = Assembly.LoadFrom(assemblyFileName);

//Object obj = assembly.CreateInstance(providerType) ;
Type type = assembly.GetType(providerType);
Object obj = Activator.CreateInstance(type);

ILocationProvider locProvider = obj as ILocationProvider;
float distance = locProvider.GetDistance(new Location(), new Location());

Если я использую отладчик и остановлюсь до того, как будут выполнены последние две строки, я могу запустить эти две строки в окне Immediate, и они будут работать. Но если я позволю запустить код, locProvider останется нулевым.

obj, кажется, имеет правильный тип:

obj.GetType() 
{Name = "LocationProviderConcrete" FullName = "LocationProvider.LocationProviderConcrete"}
    [System.RuntimeType]: {Name = "LocationProviderConcrete" FullName = "LocationProvider.LocationProviderConcrete"}
    base {System.Reflection.MemberInfo}: {Name = "LocationProviderConcrete" FullName = "LocationProvider.LocationProviderConcrete"}

И это прекрасно работает в окне Immediate:

((ILocationProvider) obj).GetDistance(new Location(), new Location())

Есть какие-нибудь подсказки, почему это не работает в нормальном потоке кода?

1 Ответ

3 голосов
/ 24 февраля 2012

Где объявлено ILocationProvider?Я предполагаю, что у вас есть одна копия в сборке, которую вы загружаете отражением, и одна копия в «работающей» сборке.Это разные интерфейсы.

По сути, вам нужно убедиться, что интерфейс загружен только в одну сборку и только в одну копию этой сборки.

Я написал эту статью лет назад - возможно, существуют более подходящие подходы к некоторым ее аспектам, но основы того, что идет не так, вероятно, все еще актуальны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...