Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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)

?

like image 366
Marc Wittke Avatar asked Sep 22 '09 11:09

Marc Wittke


People also ask

How do I find custom attributes?

Right-click on a user, then click Properties. Click the Attribute Editor tab, then confirm that the custom attribute you created is listed in the "Attribute" column (e.g., LastPassK1).

How can you specify target for custom attribute?

Which of the following are correct ways to specify the targets for a custom attribute? A. By applying AttributeUsage to the custom attribute's class definition.

Which attributes does .NET use to uniquely identify an assembly?

Assembly identity attributes Three attributes, together with a strong name (if applicable), determine the identity of an assembly: name, version, and culture. These attributes form the full name of the assembly and are required when referencing the assembly in code.

What is the use of custom attributes?

A custom attribute is a property that you can define to describe assets. Custom attributes extend the meaning of an asset beyond what you can define with the standard attributes. You can create a custom attribute and assign to it a value that is an integer, a range of integers, or a string.


1 Answers

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.

like image 186
Aykut Kllic Avatar answered Oct 23 '22 09:10

Aykut Kllic