是否可以在不暂停执行的情况下在Visual Studio 2010中编辑和继续?

zfe*_*ran 14 xna visual-studio-2010 hotswap edit-and-continue

我最近看了一下Notch的Ludum Dare直播.在他的游戏中,他广泛使用Eclipse的hotswap功能.(这是我所指的http://www.twitch.tv/notch/b/302823358?t=86m30s的视频)

我想用C#和XNA做同样的事情.幸运的是,Visual Studio具有"编辑并继续"功能.但是,我想在运行时编辑我的渲染代码而不是暂停它.

我可以设置Visual Studio来做同样的事情吗?我注意到有一个复选框Break all processes when one process breaks.是否可以在另一个线程中设置我的渲染循环,以便在我进行更改时游戏保持渲染?

And*_*ell 16

更新:此答案现已作为视频提供.


我一直在努力寻找一种方法来做到这一点.我知道这不能回答你的确切问题.但是你真正想要的是一个工作流程,你可以用零(或接近零)的延迟来改变代码,我想我已经找到了你可以用Visual Studio获得的最接近的代码.(因此避免了巨大的工程努力和处理"异常"项目).

一旦你想到它,实现这个工作流程的方法实际上非常简单:

使用快捷键!

我想出的第一种方法是使用正常的编辑并继续设置断点的方法.只有使用键盘,您才能更快地完成此操作.这仅适用于在循环中调用的代码(例如:绘制/更新).单击要修改的代码,添加断点(F9),几乎立即命中断点,修改代码,删除breakoint(F9),然后再次运行代码(F5).

这很不错.您不必使用鼠标来命中左侧列中相对较小的"添加断点"目标.但它确实将输入焦点移动到行的开头,因此您通常必须再次使用鼠标来修复它才能开始编辑.

我想要更快的东西.所以我想出了一个更好的解决方案:

再次,使用键盘:按Ctrl+ Alt+ Break键"全部中断".这几乎可以立即进入调试器,而不必担心设置断点或者您要修改的代码是否在循环中运行.这将在编辑器窗口和尖焦点切换到文档,其中执行突破,但可以随即按修复Ctrl+ -的"导航向后".

然后,您可以进行编辑,只需按下F5即可查看它们.您只需要使用鼠标一次(或根本不使用)来初步选择您要开始输入的位置 - 正如您所期望的那样.

不可否认,Ctrl+ Alt+ BreakCtrl+ -是你希望能够非常快速地完成某些事情的可怕组合键.如果只按一个键就会更好.

如果您拥有完整的Visual Studio,则可以将其转换为宏或加载项.Express没有那些 - 所以你能做的最好就是修改你的键绑定(工具,自定义,键盘......)并将它绑定到两个相邻的键,你可以快速连续按下.或者使用外部宏实用程序.

我个人已经设置了两个按键组合连续按下(你似乎不需要两者之间的延迟)由宏设置为鼠标上的备用按钮.哪个工作得相当好 - 因为我通常会同时选择文本.我也可以稍后添加一个键盘宏.

到目前为止,我已经确定了这种方法的两个小缺陷:

  • 当您再次运行该应用程序时,Visual Studio会为其提供焦点.如果它保持专注,那就太好了.向鼠标宏添加鼠标左键是快速重新编辑代码的部分解决方案.
  • "向后导航"不保留文本选择,仅保留插入位置.

  • 我希望在Visual Studio的未来版本中,此工作流程将变得更加容易.对即时反馈和热交换功能似乎越来越感兴趣.这篇演讲展示了有朝一日可能发生的事情:http://vimeo.com/36579366 (2认同)

Jas*_*onS 7

我可以告诉你怎么样,但你不会喜欢它:

1)在visual studio实例中运行你的游戏可执行文件(game.exe - > vsInstanceA)

2)使用单独的visual studio实例(modifiable.dll - > vsInstanceB)在单独的dll中编码可修改的代码

*请注意,这样做可以编译modifiable.dll,从而进行编译时错误检查等.*

......而现在它变得棘手......

3a) game.exe需要引用modifiable.dll. 不是.vcproj,实际的dll

3b)当你点击"魔术键"(让game.exe寻找按键)时,让game.exe卸载modifiable.dll,并重新加载它.您可以通过mscorlib中提供的Assembly和AppDomain类轻松完成此操作.当然这意味着你需要卸载game.exe中的任何依赖系统.

请注意,在这个3b)部分有很多挥手,这是相当多的工作,但非常直接(例如谷歌搜索:https://www.google.com/search?q = dynamic + load + dll+.网)

......之后,你很高兴......

3-alt)如果3b)不适合你,还有其他一些选择:

  • 按"魔术键"时,可以调用msbuild.exe重建modifiable.dll
  • 你可以使用CSharp编译器dll动态重新编译每个类而不是整个modifiable.dll

但不幸的是,在我10年以上的.net开发中,这是唯一的方法,除非有人创造了第三方产品(IE:他们做我提到的,为你做)