Solución:
Sí, puede hacer esto con Visual Studio. Tienes dos opciones:
Configure su proyecto para iniciar el programa externo
-
Abra su proyecto DLL.
-
En las propiedades del proyecto, vaya a la Depurar pestaña.
-
Escoger 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 pueda necesitar proporcionar, y el directorio de trabajo si es relevante.
-
Guarde el proyecto.
-
Establezca puntos de interrupción en su código donde los desee.
-
Presione F5 para comenzar a depurar. (En este punto, sus puntos de interrupción dirán que no serán afectados porque los símbolos no están cargados. No se preocupe por eso por ahora).
-
Haga todo 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 su lugar tiene que adjuntar a un proceso que ya se está ejecutando, también puede hacerlo:
(Nota al margen: si utiliza la edición “Express” de Visual Studio, no pensar tiene esta característica, pero no estoy seguro de eso. Es bastante fácil de decir: tendrá el elemento de menú 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.
-
Desde el Depurar menú, elija Adjuntar al proceso …
-
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 afectados porque los símbolos no están cargados. No se preocupe por eso por ahora).
-
Haga lo que haga para que el proceso externo 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.
nótese bien En ambos casos, si el proceso externo carga su DLL desde algún lugar que no sea el bin/Debug
carpeta de su proyecto, debe asegurarse de copiar la DLL en esa otra ubicación cada vez que lo construyes (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.
Puedes usar el Adjuntar al proceso desde el Depurar menú 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 Administrado y nativo tipo de código de la ventana que aparece al hacer clic en Seleccione botón dentro del Adjuntar al proceso ventana.
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)foobar.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. Puedes conseguir el QualifierName para su sistema desde el Adjuntar al proceso ventana. Además, la versión del código administrado (“Administrado (v4.0)” en este caso) depende de la versión de .NET framework que utilice.
Si no desea / no puede usar una aplicación externa, puede llamar a la biblioteca de clases directamente desde Visual Studio: Ctrl+Alt+I
mostrar "Immediate"
viuda, entonces puede llamar a cualquier método desde su biblioteca de clases desde allí (use puntos de interrupción). Tendrá que escribir nombres completos (es decir, espacios de nombres).