c# - documentar - generar documentacion visual studio 2017
¿Genera automáticamente la clase contenedora C#de dll en Visual Studio 2010 Express? (3)
Un colega mío me dijo que Visual Studio permite apuntar a un .dll
y generar automáticamente una clase de contenedor C #. ¿Es esto realmente posible? Y si es así, ¿cómo se puede lograr esto? ¡He navegado por la web, pero no he logrado encontrar nada!
¡Gracias a todos!
Pensé que compartiría estos recursos también,
- Cómo: crear contenedores COM
- Y cortesía de @Darin , consumir funciones DLL no administradas
3 casos:
- El archivo DLL representa un ensamblado administrado => lo referencia directamente en su proyecto y lo usa
- La DLL representa un objeto COM => puede usar la utilidad tlbimp.exe para generar una envoltura administrada
- La DLL representa una biblioteca no administrada con algunas funciones exportadas. Esa es la más difícil. No hay herramientas Deberá consultar la documentación de la biblioteca para conocer los nombres y parámetros de funciones exportados y crear contenedores de P / Invoke gestionados. Puede usar la utilidad dumpbin.exe para ver una lista de las funciones exportadas. Aquí hay un artículo en MSDN sobre los diferentes pasos.
Esto ciertamente no es posible con ninguna DLL. Solo un tipo muy específico, uno que implementa un servidor COM. El convertidor necesita una buena descripción de los tipos exportados, que una biblioteca de tipos proporciona para dichos servidores.
Una biblioteca de tipos es el equivalente exacto a los metadatos en un ensamblaje administrado. Si bien comienza su vida como un archivo independiente, un archivo .tlb, a menudo se integra como un recurso en la DLL. Un buen lugar para ello, mantiene las descripciones de tipo cerca del código que lo implementa. Al igual que los metadatos en un ensamblado .NET.
Algunas herramientas para jugar para ver las bibliotecas de tipos (no estoy seguro si funciona en Express): en Visual Studio, use Archivo + Abrir + Archivo y elija, por ejemplo, c: / windows / system32 / shell32.dll. Verá los recursos en esa DLL, observe el nodo TYPELIB. Esa es la biblioteca de tipos. Es binario, así que leerlo realmente no es práctico. Para eso, ejecute OleView.exe desde el símbolo del sistema de Visual Studio. File + View Typelib y seleccione la misma DLL. Eso descompila la biblioteca de tipos en IDL, el Lenguaje de descripción de interfaz que se utilizó originalmente para crear la biblioteca de tipos. Altamente legible, no tendrá problemas para entender el idioma. Y puede ver fácilmente cómo .NET Tlbimp.exe puede traducir esa biblioteca de tipos en declaraciones C # equivalentes.
Las bibliotecas de tipos son antiguas, han existido desde 1996. Originalmente diseñadas por el equipo de Visual Basic en Microsoft, como reemplazo de VBX, el modelo de extensibilidad de VB de 16 bits. Han tenido mucho éxito, prácticamente cualquier compilador de Windows los admite. Pero tienen un poder expresivo limitado, no hay apoyo para cosas como los genéricos y la herencia de la implementación. Notable es que el equipo de Windows 8 ha reemplazado las bibliotecas de tipos para WinRT. Escogieron el formato de metadatos .NET.
Sé que esta pregunta es bastante antigua y parece haber sido respondida lo suficiente, pero solo quiero agregar un pensamiento que creo que podría ser importante. Podría estar totalmente equivocado, así que por favor toma mi respuesta con un grano de sal y corrígeme si lo hago.
Para poder llamar miembros / campos en una DLL, la información necesaria para llamarlos debe ser accesible de alguna forma. Esa información debería ser todo lo que necesita para escribir un contenedor. Con eso, puede determinar todos los miembros / campos "formulario" también conocido como encabezados de métodos, etc.
En C #, es posible cargar archivos DLL por reflexión y obtener esa información. No sé sobre diferentes tipos de DLL como se describió anteriormente, pero como dije, para llamar a los miembros / campos esta información tiene que estar allí de alguna forma. Entonces, usando la reflexión para obtener esa Información, podría generar una nueva clase, por ejemplo, "prefixOriginalname" y hacer que tenga los mismos miembros / campos que su clase original, llamando a los miembros / campos de su clase original y agregando la funcionalidad extra deseada.
Asi que
- Cada DLL (o documento periférico) le brinda la información necesaria para usar sus tipos. Es decir, todo lo que se implementa como "público"
- Puede acceder a esta información necesaria a través de la reflexión
- Dado 1. y 2., puede crear un programa para extraer la información necesaria de la DLL y generar contenedores en consecuencia.
Como dije, no estoy 100% seguro de esto, porque las otras respuestas me hacen pensar que eso podría ser demasiado difícil o incluso imposible por alguna razón.