I want to write a program to find all the com visible .NET classes, and their ProgIDs from a .NET assembly. What's the best way to do this?
+4
A:
This will get the ProgId rather than the ClassId, and also work if the whole assembly is marked visible:
Assembly assembly = Assembly.LoadFile("someassembly.dll");
bool defaultVisibility;
object[] assemblyAttributes = assembly.GetCustomAttributes(typeof(ComVisibleAttribute),false);
if (assemblyAttributes.Length == 0)
defaultVisibility = false;
else
defaultVisibility = (assemblyAttributes[0] as ComVisibleAttribute).Value;
foreach(Type type in assembly.GetTypes())
{
bool isComVisible = defaultVisibility;
object []attributes = type.GetCustomAttributes(typeof(ComVisibleAttribute),true);
if (attributes.Length > 0)
isComVisible = (attributes[0] as ComVisibleAttribute).Value;
if (isComVisible)
{
attributes = type.GetCustomAttributes(typeof(ProgIdAttribute),true);
if (attributes.Length >0)
{
Console.WriteLine(String.Format("Type {0} has ProgID {1}",type.Name,(attributes[0] as ProgIdAttribute).Value));
}
}
}
Darren Clark
2009-04-10 20:54:33
Like it; I'll delete me answer in deference...
Marc Gravell
2009-04-10 21:30:56
Thank's I was missing the bit about if the whole assembly is marked com visible
C. Ross
2009-04-13 12:44:02