Как проверить, является ли тип из сборки ComVisible
Я пишу менеджер надстроек для Enterprise Architect.
При загрузке сборки (addin dll) мне нужно знать, какой из типов, определенных в сборке, является COM-видимым, поэтому я могу добавить необходимые разделы реестра, чтобы зарегистрировать его для COM-взаимодействия.
Вот что у меня есть до сих пор:
public EAAddin(string fileName):base()
{
//load the dll
this.addinDLL = Assembly.LoadFrom(fileName);
//register the COM visible classes
this.registerClasses(this.addinDLL);
//load referenced dll's
foreach (AssemblyName reference in this.addinDLL.GetReferencedAssemblies())
{
if (System.IO.File.Exists(
System.IO.Path.GetDirectoryName(this.addinDLL.Location) +
@"" + reference.Name + ".dll"))
{
Assembly referencedAssembly = System.Reflection.Assembly.LoadFrom(System.IO.Path.GetDirectoryName(this.addinDLL.Location) + @"" + reference.Name + ".dll");
//register the COM visible classes for the registered assembly
this.registerClasses(referencedAssembly);
// ... more code ...
private void registerClasses (Assembly assembly)
{
foreach (Type type in assembly.GetExportedTypes())
{
register(type, assembly);
}
}
private void register(Type type, Assembly assembly)
{
var attributes = type.GetCustomAttributes(typeof(ComVisibleAttribute),false);
if (attributes.Length > 0)
{
ComVisibleAttribute comvisible = (ComVisibleAttribute)attributes[0];
if (comvisible.Value == true)
{
//TODO add registry keys here
}
}
}
Это не работает, так как тип, кажется, не содержит ComVisibleAttribute.
Кто-нибудь знает, как вычислить, какие из экспортируемых типов в сборке являются COM видно?
1 ответ:
Благодаря комментарию Пауло я смог понять это. Тип имеет атрибут ComVisibleAttribute только в том случае, если он отличается от значения по умолчанию для сборки.
Таким образом, эта операция (вызываемая на одном из типов, возвращаемых
Assembly.GetExportedTypes()
), по-видимому, делает трюк/// <summary> /// Check if the given type is ComVisible /// </summary> /// <param name="type">the type to check</param> /// <returns>whether or not the given type is ComVisible</returns> private bool isComVisible(Type type) { bool comVisible = true; //first check if the type has ComVisible defined for itself var typeAttributes = type.GetCustomAttributes(typeof(ComVisibleAttribute),false); if (typeAttributes.Length > 0) { comVisible = ((ComVisibleAttribute)typeAttributes[0]).Value; } else { //no specific ComVisible attribute defined, return the default for the assembly var assemblyAttributes = type.Assembly.GetCustomAttributes(typeof(ComVisibleAttribute),false); if (assemblyAttributes.Length > 0) { comVisible = ((ComVisibleAttribute)assemblyAttributes[0]).Value; } } return comVisible; }