为什么我的模拟器部署失败,“进程无法访问该文件,因为它正被另一个进程使用”?

时间:2013-10-03 21:53:31

标签: visual-studio-2008 compact-framework emulation windows-ce visual-studio-debugging

我正在将Windows CE解决方案从.NET 1.1移植到3.5

我能够“部署”它 - 一次 - (到Pocket PC 2003 SE仿真器),然后运行.exe,它失败并显示错误消息。

在关闭模拟器之后,我在构造函数中的Visual Studio 2008 IDE中放置了一个断点,导致问题,并再次部署,希望逐步执行代码并查看问题所在。

然而,不是这个编码器的必杀技,而是被编译器的这份公报所刺痛:

“部署和/或注册失败,错误:0x8973190e。写入文件'%CSIDL_PROGRAM_FILES%\ ABC \ ABC.exe'时出错。错误0x80070020:进程无法访问该文件,因为它正被另一个进程使用。     设备连接组件“

想想也许模拟器的过程就像在南部联谊会之外的一个粉刺,我关闭Visual Studio并重新启动。我再次捣毁了F5,充满了人类乳房中永恒的希望,只是被同样的信息再次搭讪。

我需要做些什么来恢复我的模拟器?

作为<aside&gt;,我发现奇怪的是我无法拍摄模拟器的屏幕截图 - PrtScn和Alt + PrtScn都无法用剪切像素填充剪贴板。

更新

我随后部署到“美国Windows Mobile 5.0 Pocket PC R2仿真器”,我的应用程序运行“设备”,但当我尝试将应用程序放在其中时,我得到:“例外:文件或程序集名称'System.Core,Version = 3.5.0.0 ...,或其中一个依赖项,未找到

我看到文件资源管理器有一个“.NET CF 2.0”文件夹,但没有“.NET CF 3.5” - 但是使用3.5的应用程序已部署到设备上(至少部分)...我纠正假设会有这样一个文件夹?如果没有,System.Core版本3.5应该放在哪里?

更新2

接下来,我尝试了“Windows Mobile 5.0 Smartphone Device R2”,并收到错误消息:“部署和/或注册失败,错误:0x8973190e。写入文件时出错'\ Windows \ NETCFv35.wm.ARMV4I.cab '。错误0x80070070:磁盘上没有足够的空间。     设备连接组件

宾夕法尼亚嘻哈! (密钥-RAP!)

...哦,oops - 我实际上想再次使用模拟器,而不是将它部署到实际的设备上。

更新3

我再次得到这个错误的消息,直接部署到设备。我今天跑了好几次,最后几次失败了,这可能是一个糟糕的REST调用(客户端上的错误措辞)。现在我再次看到“磁盘上没有足够的空间”爵士乐。

我尝试了JP2Code的建议,但我看不到任何正在运行的应用程序,也没有表面上存储名称的标签:

enter image description here

至于将此.Close()添加到Exit代码中,已存在的是:

DialogResult userResponse =
    MessageBox.Show("Are you sure you want to exit Duckbill?", Platypus.GetFormTitle("", "", ""),
        MessageBoxButtons.YesNo,
        MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

if (userResponse == DialogResult.Yes)
{
    Dispose(false);
}

我不知道为什么原始编码器会这样做,但我认为这种花哨的代码会避免调用this.Close() - 或者不是吗?

相当奇怪和可怕的自定义“Dispose”方法是(评论我的):

protected override void Dispose(bool disposing)
{
    dbconn.DBClose();
    base.Dispose(disposing);
    Application.Exit(); // Why?
    // I would add to that "Why?" comment above with a reference to this:
    // http://codereview.stackexchange.com/questions/23133/is-there-a-valid-answer-to-this-why-comment
    // This makes me think twice about removing it, though:
    // http://social.msdn.microsoft.com/Forums/en-US/clr/thread/15efa70b-0065-44ef-ab09-7088fefd52b0
    // If it becomes a problem/there are complaints about it crashing when closing, revisit...
    // Could this have been the cause of the NRE that I ended up "eating"? See frmEntry.saveDSD()'s 
    // catch block
}

2 个答案:

答案 0 :(得分:3)

模拟器上的旧应用程序进程仍在运行。重新启动模拟器,或者更好的是,使用远程进程查看器查找并终止它。

修改

您遇到的初始错误肯定是由于进程仍在目标设备上运行。请记住,每个项目都有一个目标设备的设置,因此很可能您将EXE指向一个设备(模拟器是设备)和指向不同设备的DLL。然后,Visual Studio将这些程序集部署到不同的位置,因此您的DLL可能会进入模拟器,但EX会转到连接到PC的物理设备,而您根本没有意识到它在哪里运行。在这种情况下,重置仿真器不会停止该过程。是的,它可能会让人感到困惑。

第一次更新中的错误表示未安装CF 3.5。如有必要,项目应该部署它(您可以在项目属性中关闭它)。您可以通过运行cgacutil.exe来验证它是否已安装(它应该位于\ Windows文件夹中)。不会有任何已安装的文件夹,因为CF应该直接进入\ Windows目录。另外,请确认您没有安装CF 2.0和3.5 - 这可能会导致令人头疼的问题。很多头痛。

对于Update 2,Studio正在尝试将CF CAB文件推送到目标设备进行安装,但它的空间不足。

答案 1 :(得分:3)

点击Start > Settings,然后点按System标签。

System Tab

点按Memory,然后点按Running Programs标签。

Running Programs

找到您的应用,然后点击...呃,我的意思是点按Stop

现在,关闭你的申请。

要在将来阻止此操作,请打开项目的主窗体,查看该窗体的属性,并将ControlBox设置为False

应该在表单关闭时退出应用程序。

ControlBox

但是,自从我对这部分进行编码以来已经有很长一段时间了,所以我可能会在那里发现。

有一点可以肯定地关闭它是通过写Close()命令,就像我为Exit菜单项所做的那样:

private void mi_Exit_Clicked(object sender, EventArgs e) {
  this.Close();
}

这应该足以退出应用程序。

现在,如何让设备重新激活在内存中运行的应用程序将是一个很好的学习技巧。我猜测Visual Studio对此并不友好,因为可执行构建通常会有所不同。