C# – How to get custom attributes from an assembly that is not (really) loaded

assembliesattributescplugins

We all know that the assembly can be queried for attributes using the GetCustomAttributes method. I want to use this to identify an extension module for my application. However, to avoid loading every assembly I prefer a defensive approach:

  1. using Assembly.ReflectionOnlyLoadFrom to get more details about an assembly (has it my ModuleAttribute?)

  2. if the ModuleAttribute is found, I will finally load it using Assembly.LoadFrom

Unfortunately it seems that there is no way to get the attributes from an assembly, that is loaded into the reflection-only context:

myAssembly.GetCustomAttributes(typeof(ModuleAttribute), false)

fails with an InvalidOperationException ("It is illegal to reflect on the custom attributes of a Type loaded via ReflectionOnlyGetType") and

CustomAttributeData.GetCustomAttributes(myAssembly)

fails with ReflectionTypeLoadException because of dependant assemblies not being loaded.

So how to get the attributes without

  1. polluting my application domain with useless (maybe harmful) types by calling Assembly.LoadFrom
  2. the need to load all referenced assemblies
  3. the need for separate application domains (gave it a short try, smelled like even more PITA)

?

Best Answer

It is possible to load (reflection only) assemblies with dependencies.

AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += (s, e) => Assembly.ReflectionOnlyLoad(e.Name);

would fix failures when loading, assuming they are all in the same folder.