У меня есть приложение ASP.net, которое ссылается на внешнюю сборку, которая мне нужна для динамической загрузки и обнаружения любых типов, реализующих известный интерфейс. Проблема, с которой я сталкиваюсь, заключается в том, что отображаемый мной тип не соответствует тому интерфейсу, который работает, и поэтому я не могу его привести.
Пример:
Этот код запускается в приложении ASP.net.
var assembly = Assembly.LoadFile(Path.Combine(HttpRuntime.BinDirectory, "ExternalAssembly.dll"));
var type = assembly.GetExportedTypes().First<Type>(x => x.Name == "AClass"); // AClass implements IAInterface
var reflectedInterface = type.GetInterface(typeof(IAmAInterface).ToString());
if (reflectedInterface != typeof(IAmAInterface))
throw new Exception("This makes me sad"); // This code gets run
Единственное различие, которое я вижу между отраженным интерфейсом, загруженным из корзины, и интерфейсом, возвращаемым из typeof, заключается в том, что сборка typeof находится в пути к временному ASP.net (C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Временные файлы ASP.NET \ root \ 08c43c8b \ 3adac8cf \ assembly \ dl3 \ eb7a4127 \ 0235ea60_a3c8c901 \ ReflectionTest.DLL)
Спасибо, Пол Александр, я изменил код для использования метода Assembly.Load, а не Assembly.LoadFile, который решает проблему.
wwilden: я также пытался извлечь интерфейс в его собственную сборку, и это также решает проблему.