es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener todos los tipos en un ensamblado de interoperabilidad de referencia.

Tengo un par de ensamblados de interoperabilidad de los cuales necesito obtener todos los tipos que contienen. He visto esta pregunta y no funciona ni se aplica a mi caso. Todos estos ensamblados referenciados se utilizan directamente en mi aplicación pero no aparecen en ninguna parte.

Lo que he intentado y los resultados que he obtenido son los siguientes. Tenga en cuenta que he probado simplemente con una clase al azar que tengo por ahí y hace lo mismo con todas las demás bibliotecas de interoperabilidad que tengo en el proyecto.

// No contiene el ensamblado SldWorks.
var allAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();

//{MyApp, Versión = 0.0.0.0, Culture = neutral, PublicKeyToken = null}
// Esto es incorrecto
var assemblyOfClassInDLL = System.Reflection.Assembly.GetAssembly(typeof(Component2));

//{MyApp, Versión = 0.0.0.0, Culture = neutral, PublicKeyToken = null}
// Esto es incorrecto
var assemblyOfClassInDLL2 = typeof(Component2).Assembly;

// SldWorks.Component2, MyApp, Versión=0.0.0.0, Culture=neutral, PublicKeyToken=null
// Esto es muy incorrecto.
var assemblyNameOfClassInDLL = typeof(Component2).AssemblyQualifiedName;

// No contiene el ensamblado SldWorks.
var referencedAssemblies = System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies();

Trate de
{
var testLoad = System.Reflection.Assembly.Load(assemblyNameOfClassInDLL);
}
catch (Excepción ex)
{
// Could not load file or assembly ‘SldWorks.Component2\, MyApp\, Version\=0.0.0.0\,
// Culture\=neutral\, PublicKeyToken\=null’ or one of its dependencies. The given assembly name or codebase
// was invalid. (Exception from HRESULT: 0x80131047)
}

Observe que la clase “Component2” está dentro del ensamblado “SldWorks”, que es una DLL de interoperabilidad. Aunque la única línea que parece encontrarla es “typeof(Component2).AssemblyQualifiedName”, que la devuelve incorrectamente como si estuviera en “MyApp”. Luego en el “Try…Catch” intento cargar ese mismo ensamblado que acabo de recibir del código y se bloquea. ¿Por qué C# devuelve un nombre de ensamblado que definitivamente no existe?

Debe ser posible, ya que en Visual Studio puedo navegar por todo dentro de la ventana “Objeto de exploración”. Entonces, si la solución es usar el mismo código que utiliza la ventana “Objeto de exploración”, no es un problema ni una carga de rendimiento. Este código ahorra literalmente de 2 a 3 días de trabajo cada vez que se utiliza en lugar de escribir manualmente cada clase en un DLL en el código y actualizar cada vez que las compañías lanzan actualizaciones automáticas.

Solo tengo 2 requisitos:

1 – SOLO recibo un objeto del cual necesito encontrar su tipo y ensamblado al que pertenece y devolver todos los tipos en el mismo ensamblado.

2 – Mi aplicación es un complemento de carga dinámica, por lo que NO es un ejecutable.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para obtener todos los tipos en los ensamblados de interoperabilidad que se utilizan en una aplicación pero no aparecen en ninguna parte, se puede utilizar el siguiente código:

    var assemblyName = "SldWorks"; // Reemplazar con el nombre del ensamblado de interoperabilidad
    var assembly = System.Reflection.Assembly.Load(assemblyName);
    var types = assembly.GetTypes();
    

    Esto debería devolver un arreglo de todos los tipos en el ensamblado de interoperabilidad especificado. Si hay varios ensamblados de interoperabilidad, el código se puede repetir para cada nombre de ensamblado.

    Es importante tener en cuenta que los ensamblados de interoperabilidad pueden no aparecer en AppDomain.CurrentDomain.GetAssemblies() o en System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies(), ya que pueden ser cargados en tiempo de ejecución cuando son necesarios. Por lo tanto, es necesario utilizar el método System.Reflection.Assembly.Load() para cargar el ensamblado de interoperabilidad explícitamente.

    En cuanto al problema de que AssemblyQualifiedName devuelve el nombre incorrecto del ensamblado, puede ser causado por la forma en que se referencia el ensamblado de interoperabilidad en el proyecto. Para asegurarse de que se devuelva el nombre correcto del ensamblado, se recomienda utilizar el mismo nombre que aparece en las propiedades de referencia en Visual Studio.

    En general, los dos requisitos mencionados se pueden cumplir utilizando el método System.Reflection.Assembly.Load() para cargar el ensamblado de interoperabilidad explícitamente, y luego utilizando Assembly.GetTypes() para obtener todos los tipos en el mismo ensamblado que el objeto especificado.

Comments are closed.