c# - studio - ¿Cómo depurar la biblioteca de clases que llama desde una aplicación externa?
visual studio installer (4)
Hay un flujo de trabajo externo que ejecuta scripts en C # y puede trabajar con archivos DLL (mi biblioteca de clases).
¿Es posible adjuntar depuración a mi proyecto de biblioteca de clases, de modo que el punto de interrupción afecte una vez que este WF lo llame?
Gracias
Creo que hoy en día es más real crear un proyecto de prueba de Unidad para ejecutar el código de su biblioteca. Así matará dos pájaros de un tiro: podrá depurar su proyecto en la misma solución y, por cierto, comenzará a cubrir su código mediante pruebas.
Puede usar Adjuntar para procesar desde el menú Depurar para depurar su proyecto DLL. Es posible que deba utilizar la depuración en modo mixto si la depuración no ocurre con el código nativo. Esto se puede hacer seleccionando el tipo de código administrado y nativo en la ventana que aparece al hacer clic en el botón Seleccionar dentro de la ventana Adjuntar para procesar .
Si la edición de Visual Studio que está utilizando admite macros, puede crear una nueva macro con el siguiente código para automatizar todo esto:
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics
Public Module AttachToProcess
Public Sub DebugMyDLL()
DTE.ExecuteCommand("Build.BuildSelection")
Dim ApplicationExePath As String = "C:/Program Files (x86)/foo/bar.exe"
Shell(ApplicationExePath)
Try
Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
Dim dbgeng(2) As EnvDTE80.Engine
dbgeng(0) = trans.Engines.Item("Managed (v4.0)")
dbgeng(1) = trans.Engines.Item("Native")
Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "<QualifierName>").Item("bar.exe")
proc2.Attach2(dbgeng)
Catch ex As System.Exception
MsgBox(ex.Message)
End Try
End Sub
End Module
La macro anterior intenta construir su proyecto, inicia la aplicación externa y luego adjunta su DLL a ese programa automáticamente. Puede obtener el QualifierName para su sistema desde la ventana Adjuntar a procesar . Además, la versión del código administrado ("Administrado (v4.0)" en este caso) depende de la versión de .NET framework que use.
Sí, puedes hacer esto con Visual Studio. Tienes dos opciones:
Configura tu proyecto para iniciar el programa externo.
Abra su proyecto DLL.
En las propiedades del proyecto, vaya a la pestaña Depuración .
Elija Iniciar programa externo y proporcione la ruta del programa externo que llamará a su DLL, junto con cualquier argumento de línea de comandos que deba proporcionar, y el directorio de trabajo si es relevante.
Guarda el proyecto.
Establezca puntos de interrupción en su código donde los desee.
Presione F5 para iniciar la depuración. (En este punto, sus puntos de interrupción dirán que no serán alcanzados porque los símbolos no están cargados. No se preocupe por eso por ahora).
Haga lo que haga para que la aplicación externa cargue su biblioteca y ejecute su código.
Visual Studio detectará la carga del módulo, cargará los símbolos y se detendrá en el punto de interrupción.
Adjuntar a un proceso existente
Si no puede iniciar el proceso pero, en cambio, tiene que adjuntarse a un proceso que ya se está ejecutando, también puede hacerlo:
(Nota: si está utilizando la edición "Express" de Visual Studio, no creo que tenga esta característica, pero no estoy seguro de eso. Es bastante fácil decirlo: tendrá el menú artículo mencionado en el paso 4 a continuación o no.)
Asegúrese de que el proceso se está ejecutando.
Abra su proyecto DLL.
Establezca sus puntos de interrupción, etc.
En el menú Depurar , elija Adjuntar para procesar ...
En el cuadro de diálogo resultante, busque el proceso en la lista, resáltelo y haga clic en Adjuntar .
Visual Studio entrará en modo de depuración. (En este punto, sus puntos de interrupción dirán que no serán alcanzados porque los símbolos no están cargados. No se preocupe por eso por ahora).
Haga lo que haga para que el proceso externo se cargue y ejecute su código.
Visual Studio detectará la carga del módulo en el proceso externo, cargará sus símbolos y se detendrá en su punto de interrupción.
NB En ambos casos, si el proceso externo carga su DLL desde otro lugar que no sea la carpeta bin/Debug
de su proyecto, debe asegurarse de copiar el DLL en esa otra ubicación cada vez que lo genere (puede configurarlo para que suceda) automáticamente en las opciones del proyecto). De lo contrario, Visual Studio no podrá detectar que la DLL que se está cargando es la que está intentando depurar.
Si no desea / no puede usar una aplicación externa, puede llamar a la biblioteca de clases directamente desde Visual Studio: Ctrl+Alt+I
para mostrar la viuda "Immediate"
, luego puede llamar a cualquier método desde su biblioteca de clases desde allí ( utilizar puntos de interrupción). Tendrá que escribir nombres completos (es decir, espacios de nombres).