调试 DLL 项目
本主题适用于:
版本 |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
学习版 |
|||||
专业版、高级专业版和旗舰版 |
以下模板可创建 DLL:
(C++、C# 和 Visual Basic):类库
(C++、C# 和 Visual Basic):Windows 窗体控件库
调试 Windows 控件库类似于调试类库项目。 大多数情况下将从另一个项目中调用 Windows 控件。 调试调用项目时,可单步执行 Windows 控件的代码,并设置断点,然后执行其他调试操作。 有关更多信息,请参见 Windows 窗体控件。
(C# 和 Visual Basic):Web 控件库
有关更多信息,请参见 Web 控件库(托管代码)。
(C++):MFC ActiveX 控件和 MFC 智能设备 ActiveX 控件
ActiveX 控件是可以通过 Internet 下载到客户端计算机,并在网页上显示和激活的控件。
ActiveX 控件的调试与其他类型的控件的调试类似,因为这些控件都无法独立运行,而且必须嵌入 HTML 网页中。 有关更多信息,请参见如何:调试 ActiveX 控件。
(C++):MFC 智能设备 DLL
有关更多信息,请参见 MFC 调试技术。
本节还包含有关以下主题的信息:
此主题包含以下几节,这几节提供了有关如何准备调试类库的注意事项:
生成调试版本
混合模式调试
更改默认配置
调试 DLL 的方法
调用应用程序
网页上的控件
“即时”窗口
生成调试版本
无论如何启动调试,都请首先确保生成 DLL 的调试版本,并确保该调试版本位于应用程序应该能够找到它的位置。 这似乎很明显,但如果忘记这一步骤,应用程序可能会找到并加载 DLL 的其他版本。 然后程序将继续运行,尽管您会奇怪为什么断点从未被命中。 调试时,可以通过打开调试器的**“模块”**窗口来检查程序已加载的 DLL。 **“模块”**窗口列出了所调试进程中加载的每个 DLL 或 EXE。 有关更多信息,请参见如何:使用“模块”窗口。
为了使调试器附加到用 C++ 编写的代码,该代码必须发出 DebuggableAttribute。 可通过链接 /ASSEMBLYDEBUG 链接器选项将它自动添加到代码中。
混合模式调试
调用 DLL 的调用应用程序可以用托管代码编写,也可以用本机代码编写。 如果托管 DLL 由本机代码调用,并且您需要调试两者,则必须同时启用托管调试器和本机调试器。 可以在**“<项目> 属性页”**对话框或窗口中选中此选项。 具体如何检查取决于是从 DLL 项目中启动调试,还是从调用应用程序项目中启动调试。 有关更多信息,请参见如何:在混合模式下调试。
更改默认配置
用项目模板创建控制台应用程序项目时,Visual Studio 将自动为调试和发布配置创建所需的设置。 必要时,可更改这些设置。 有关更多信息,请参见C++ 调试配置的项目设置、C# 调试配置的项目设置、Visual Basic 调试配置的项目设置和如何:设置调试和发布配置。
调试 DLL 的方法
本节的每个项目都创建一个 DLL。 您无法直接运行 DLL,它必须由应用程序(通常为 EXE)调用。 有关更多信息,请参见 创建和管理 Visual C++ 项目。 调用应用程序可能满足下列任一条件:
内置在同一 Visual Studio 解决方案中包含类库的另一个项目中的应用程序。
已经部署到测试或生产计算机上的现有应用程序。
位于 Web 上并通过 URL 访问。
包含嵌入了 DLL 的网页的 Web 应用程序。
调试调用应用程序
若要调试 DLL,请从调试调用应用程序开始,通常是 EXE 或者 Web 应用程序。 调试方式有许多种。
如果有调用应用程序的项目,则可以打开该项目并从**“调试”**菜单开始执行。 有关更多信息,请参见如何:开始执行。
如果调用应用程序是已经部署到测试或生产计算机上并已经运行的现有程序,则可以附加到该应用程序上。 如果 DLL 是由 Internet Explorer 承载的控件或网页上的控件,请使用此方法。 有关更多信息,请参见如何:附加到运行进程。
您可以从 DLL 项目中调试。 有关更多信息,请参见如何:从 DLL 项目进行调试。
可以从 Visual Studio**“即时”窗口中进行调试。 在这种情况下,“即时”**窗口充当应用程序的角色。
在开始调试调用应用程序之前,通常希望在类库中设置一个断点。 有关更多信息,请参见 断点与跟踪点。 命中断点时,可以逐句通过代码,同时观察每行的操作,直到将问题隔离出来。 有关更多信息,请参见代码单步执行概述。
网页上的控件
若要调试网页控件,请创建嵌入此控件的 ASP.NET 页(如果尚不存在这样的页)。 然后在网页代码和控件代码中设置断点。 然后从 Visual Studio 中调用网页。
在开始调试调用应用程序之前,通常需要在 DLL 中设置一个断点。 命中断点时,可以逐句通过代码,同时观察每行的操作,直到将问题隔离出来。 有关更多信息,请参见 断点与跟踪点 和 代码单步执行概述。
“即时”窗口
可以在没有调用应用程序的情况下计算 DLL 中的函数或方法。 可以进行设计时调试并使用**“即时”**窗口。 若要以这种方式进行调试,请在 DLL 项目打开时按照以下步骤操作:
打开调试器**“即时”**窗口。
若要测试类 Class1 中名为 Test 的方法,请通过在“即时”窗口中键入以下 C# 代码来实例化类型为 Class1 的对象。 对语法进行以下适当更改后,此托管代码对 Visual Basic 和 C++ 有效:
Class1 obj = new Class1();
在 C# 中,所有名称必须是全限定名称。 而且,任何方法或变量都必须处在调试会话的当前范围和上下文中。
假设 Test 带有一个 int 参数,使用**“即时”**窗口计算 Test:
?obj.Test(10)
结果将打印在**“即时”**窗口中。
您可以继续调试 Test,方法为在其中设置断点然后再次计算函数:
?obj.Test(10);
断点将被命中,然后您将可以逐步调试 Test。 当执行离开 Test 后,调试器将返回设计模式。