Ich habe eine .Net4-Assembly, die eine abstrakte Basisklasse verfügbar macht. In derselben Assembly habe ich Code, der alle Dateien in einem Ordner widerspiegelt, um eine Liste von Klassen zu erstellen, die diese Basisklasse erben. Hier ist die ausgeprägte RoutineReflectionTypeLoadException und COM-Interop
private JsonTextWriter GetAvailableServices(JsonTextWriter writer, string path)
{
try
{
writer.WriteStartArray();
writer = new DirectoryInfo(path).GetFiles(FileFilter)
.Where(f => IsAssembly(f.FullName))
.Select(f => Assembly.LoadFile(Path.Combine(path, f.Name)))
.SelectMany(a => GetLoadableTypes(a))
.Where(p => typeof(ServiceProxy).IsAssignableFrom(p) && !p.IsAbstract)
.Select(a0 => new { Instance = Activator.CreateInstance(a0), ClassName = a0.ToString() })
.Aggregate(writer, (s, v) =>
{
s.WriteStartObject();
s.WritePropertyName(ClassnameLabel);
s.WriteValue(v.ClassName);
s.WritePropertyName(DescriptionLabel);
s.WriteValue(((ServiceProxy)v.Instance).Description);
s.WriteEndObject();
return s;
});
}
catch { Exception ex; }
finally
{
writer.WriteEndArray();
}
return writer;
}
private IEnumerable<Type> GetLoadableTypes(Assembly assembly)
{
try
{
return assembly.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
return e.Types.Where(t => t != null);
}
}
ich einen Komponententest haben, die diesen Code ausgeführt wird, einen bestimmten Ordner Targeting, und es funktioniert gut, eine Liste von Klassen Rückkehr der Basisklasse als JSON vererben.
Der obige Code befindet sich in einer Assembly, die von einer COM (VB6) -Komponente aufgerufen werden soll. Wenn ich jetzt denselben Code von COM aufrufe, der auf den gleichen Ordner abzielt, auf den der Unit-Test zielt, erhalte ich den Reflektionsfehler und die Loader-Info meldet, dass er die Assembly, die den obigen Code enthält, nicht laden kann. Das tritt nur in der GetLoadableTypes
-Routine auf dem GetTypes()
-Aufruf auf, wenn ich über eine Assembly nachdenke, die Klassen enthält, die die Basisklasse erben.
Es klingt fast wie ein Re-Entrance-Problem, das nur auftritt, wenn COM beteiligt ist. Ich denke, ich könnte die abstrakte Basisklasse in eine andere Baugruppe einfügen, aber ich fragte mich, ob da noch etwas anderes vor sich ging.
Jede Erklärung oder Zeiger offensichtlich erhielt dankbar
Fehlermeldung:
Reflection „. Können Sie eine oder mehrere der angeforderten Typen laden Rufen Sie die Loaderexceptions-Eigenschaft für mehr Informationen“
und in der Loaderexceptions:
„kann nicht Datei oder Assembly laden 'IfxGenDocService, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' oder eine ihrer Abhängigkeiten Die . System kann die angegebene Datei nicht finden. ":" IfxGenDocService, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null“
EDIT1: ich änderte die Dinge ein wenig herum, die Basisklasse in seinen eigenen Arsch zu extrahieren embly und bekomme immer noch den gleichen Fehler. Vielleicht relevant ist, dass ich eine Test-Assembly habe, die 3 Klassen enthält, die die Basisklasse erben. Ich bekomme 3 Loaderexceptions (alle die gleichen wie oben angegeben. I 1 für jede Klasse übernehmen.
Können Sie die vollständige Fehlermeldung hinzufügen? – thehennyy
Thx .. gerade hinzugefügt –