如何使用Visual Studio的“即时窗口”调用外部程序集方法?

3
你如何部署程序集,以便可以在“立即窗口”中调用实用库中的方法,而无需将解决方案项目引用添加到MyCompany.DebuggingTools.dll中?
背景:我编写了一个实用程序库(让我们称其为:MyCompany.DebuggingTools.dll),其中包括在开发过程中调试应用程序时有用的方法。理想情况下,我希望能够:1. 使用“立即窗口”调用实用库中的方法;2. 测试的应用程序将不会有任何关于MyCompany.DebuggingTools.dll的解决方案项目引用;3. 实质上,我正在尝试扩展“立即窗口”的功能。
更多信息:
Visual Studio 2017、Windows 10。针对测试项目的程序集是一个简单的C#类库,使用由Visual Studio生成的密钥文件进行签名。 MyCompany.DebuggingTools.dll已添加为测试项目的引用,可以从“立即窗口”调用工具库,并且正常工作。但是,如果测试项目未添加对实用工具库的引用,则在尝试从“立即窗口”调用工具之一时,会出现以下错误提示:“error CS0246: The type or namespace name 'MyCompany' could not be found (are you missing a using directive or an assembly reference?)”.

你说想要使用即时窗口,那么你的汇编或 PAB 文件是否已经在 VS 中加载了?http://www.adamtuliper.com/2009/11/debugging-in-gac-all-ways-to-accomplish.html,简单的方法是我们需要添加引用,然后在 VS 中进行调试,但如果你没有将其添加为引用,一个问题是如何真正加载这个程序集或在项目中调用一个方法。 - Jack Zhai
我不明白那有什么区别。我相当确定你对GAC的本质理解有误。 - Liam
1
@Liam:我的要求是调试工具必须完全独立于测试项目之外。这就是为什么我不能简单地向项目添加引用。实际上,我正在尝试扩展“Immediate Window”的功能。 - Pressacco
1
听起来你正在尝试开发一个 Visual Studio 插件。我建议朝这个方向做些研究。为了避免重复(很多次),就像我之前说的那样,你基础上误解了 GAC 的含义。把东西放到 GAC 里并不能让你在立即窗口中调用它。立即窗口会调用附加进程该进程引用的内容。将内容添加到 GAC 中并不能使进程引用它。 - Liam
2
@Liam:我可能完全错了,但我的理解是_Immediate Window_不仅仅是那样。例如,您可以通过发出命令(如> Debug.Disassembly)来操纵IDE(当调试器已连接)。当我看到这个时,我想:也许有一种方法可以扩展_Immediate Window_而无需编写正式的_Visual Studio_扩展?也许有一种方法可以在_Visual Studio_初始化时加载MyCompany.DebuggingTools.dll程序集?这就是我最初发布的起源。 - Pressacco
显示剩余6条评论
1个回答

3
最初的回答:我在寻找类似的东西 - 这是一个完全的 hack,但在 Visual Studio 2017 的即时窗口中可以工作,如果你正在使用它进行棘手的调试会话,那么这可能值得一试:
dynamic xx = System.Activator.CreateInstance(System.Reflection.Assembly.LoadFile(@"C:\dev\ImmediateWindowHelpers.dll").GetType("FullyQualifiedNamespace.Helpers"));

当Helpers类是非静态时。现在,我可以对其调用方法:

最初的回答:

当Helpers类不是静态的时候,我可以使用它的方法:
xx.PrintParameters(sqlParameterList);

由于它会返回一个字符串,因此它将简单地显示在立即窗口中。我测试过了,对我有效。同样,此实例仅在调试会话中存在,并且每次需要加载。一旦你习惯了,这并不是什么大问题,只需一行代码。
我想,某种Visual Studio扩展可能更加理想,当你调试时它会为你加载程序集,或者如果将程序集构建时包含在应用程序域中会怎么样?我从未研究过这些东西,但如果你花费了大量时间进行调试,那么似乎值得去做。

1
非常有趣!我可能错了,但我认为您可以为加载辅助库的代码创建别名。我认为语法是:alias <AliasName> <YourCommand>。您绝对可以为Visual Studio公开的命令(例如菜单中的任何内容)创建别名......我不确定是否可以为CSharp代码创建别名。不幸的是,我现在无法访问计算机进行尝试。感谢您的帖子Jason。 - Pressacco
1
我无法让“别名”起作用。如果我弄清楚了,我会发布更新的。 - Pressacco
@Pressacco - 好的。再说一遍,这很有趣。我正在开发一个需要大量时间在调试器中支持的应用程序。因此,通过这些方法获得帮助非常好。如果我开发了任何其他东西,我会告诉你的,我想让这尽可能简单。也许一个允许您在配置中指定每当调试器运行时要加载的DLL的VS插件/扩展会很不错。 - Jason Bunting

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接