I want to add some functionality to every module/plugin written such as:
Author, Company, Date, etc
that represents where it’s coming from and who wrote it. Then the programmer could have multiple plugins in a single DLL. How should I implement support for these so I can access them in the main application UI? Generally 1 plugin is a single public class.
Should I use Properties or attributes? Also should I use interfaces?
I want these things to be filled by the programmer, and not make it optional.
Since the data is technically metadata about the class, and not actual state required by the plugin, I would use attributes. Attributes are intended to be metadata about the code, which is what you want.
As far as enforcing them, you could have the host application fail to load the plugin if the metadata was missing. That way, the plugin developer would not be able to test the plugin without providing the data. However, you should provide ample documentation so they know what they are missing, or provide detailed errors when you fail to load the plugin.
Most assemblies already have some basic information (Company, Version, etc.) that is set in the AssemblyInfo class. You could also possibly leverage this instead as well.
Also, to prevent the missing data problem, you could use a single PluginAttribute that took all the metadata in as parameters on the property, and require that attribute for your host to load the class. I was initially thinking one attribute per item you wanted to record, but a single attribute would work even better.