更新: 可以在Microsoft Connect中找到重现此错误的示例项目.我还测试并验证了下面接受的答案中给出的解决方案适用于该示例项目.如果此解决方案不适合您,您可能遇到了另一个问题(属于另一个问题).
这是一个之前提出的问题,无论是Stack Overflow还是其他地方,但我发现的这些建议都没有帮助我,所以我只想尝试一个新问题.
场景:我有一个简单的Windows窗体应用程序(C#,.NET 4.0,Visual Studio 2010).它有大多数其他形式继承的基本形式,它使用Entity Framework(和POCO类)进行数据库访问.没什么好看的,没有多线程或任何东西.
问题:一切都很好.然后,当我即将启动应用程序时,Visual Studio无法构建.我收到警告"无法删除文件'... bin\Debug\[ProjectName] .exe'.访问路径'... bin\Debug\[ProjectName] .exe'被拒绝." 和错误"无法将文件'obj\x86\Debug\[ProjectName] .exe'复制到'bin\Debug\[ProjectName] .exe'.进程无法访问文件'bin\Debug\[ProjectName] .exe "因为它被另一个进程使用了." (我在运行Rebuild时得到警告和错误,但只运行Build时出错 - 不认为这是相关的吗?)
我完全理解警告和错误消息的内容:Visual Studio显然试图覆盖exe文件,同时由于某种原因它同时锁定它.但是,这并没有帮助我找到问题的解决方案......我发现唯一有效的方法是关闭Visual Studio并重新启动它.然后构建和启动工作,直到我在某些表单中进行更改,然后我再次遇到相同的问题并且必须重新启动...非常令人沮丧!
正如我上面提到的,这似乎是一个已知的问题,所以有很多建议的解决方案.我将列出我在这里尝试过的内容,以便人们知道要跳过的内容:
将以下内容添加到项目的预构建事件中:
if exist "$(TargetPath).locked" del "$(TargetPath).locked"
if not exist "$(TargetPath).locked" if exist "$(TargetPath)" move "$(TargetPath)" "$(TargetPath).locked"
Run Code Online (Sandbox Code Playgroud)将以下内容添加到项目属性(.csproj文件):
<GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies>
Run Code Online (Sandbox Code Playgroud)但是,他们都没有为我工作,所以你可能会明白为什么我开始有点沮丧.我不知道在哪里可以看,所以我希望有人能给我一些东西!这是VS中的一个错误,如果是这样的补丁?或者我做错了什么,我有一个循环引用或类似的,如果是这样我怎么能找到?
任何建议都非常感谢:)
更新:如在下面评论中提及,我也使用Process Explorer的,它实际上检查是 Visual Studio中被锁定的文件.
在C#WinApp中,如何将Text和Value添加到我的ComboBox的项目中?我做了一个搜索,通常答案是使用"绑定到源"..但在我的情况下,我的程序中没有准备好绑定源...我怎么能这样做:
combo1.Item[1] = "DisplayText";
combo1.Item[1].Value = "useful Value"
Run Code Online (Sandbox Code Playgroud) 我有一个字符串"测试1"和我的组合框包含test1
,test2
和test3
.如何将所选项目设置为"test1"?也就是说,如何将我的字符串与其中一个comboBox项匹配?
我在考虑下面这一行,但这不起作用.
comboBox1.SelectedText = "test1";
Run Code Online (Sandbox Code Playgroud) 我有一个控件,我必须做大量修改.当我这样做时,我想完全阻止它重绘 - SuspendLayout和ResumeLayout是不够的.如何为控件及其子项暂停绘画?
我们如何在Windows窗体中获得标签的自动换行功能?
我在一个面板中放置了一个标签,并添加了一些动态标签的文字.但它超出了面板长度.我怎么解决这个问题?
我已经痛苦地意识到需要在事件驱动的GUI代码中编写以下代码模式的频率,其中
private void DoGUISwitch() {
// cruisin for a bruisin' through exception city
object1.Visible = true;
object2.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)
变为:
private void DoGUISwitch() {
if (object1.InvokeRequired) {
object1.Invoke(new MethodInvoker(() => { DoGUISwitch(); }));
} else {
object1.Visible = true;
object2.Visible = false;
}
}
Run Code Online (Sandbox Code Playgroud)
这是C#中的一个尴尬模式,无论是记忆还是打字.有没有人提出某种捷径或构造,在一定程度上自动化?如果有一种方法可以将函数附加到执行此检查的对象,而不必经历所有这些额外的工作,如object1.InvokeIfNecessary.visible = true
类型快捷方式,那就太酷了.
上一页答案已经讨论的只是打电话的invoke()每次不切实际,甚则调用()语法既效率低下,仍然尴尬应对.
那么,有没有人想出任何捷径?
我在C#中发布了一个应用程序.这里的问题是每当我通过单击红色退出按钮关闭主窗体时,它会关闭窗体,但它不会关闭应用程序.当我尝试关闭计算机时,我发现了这一点,希望我制作的应用程序运行顺畅,然后我被很多子窗口轰炸,我已经将MessageBox Alerts 放入其中.
我尝试了Application.Exit,但它仍然调用所有子窗口和警报,我不知道如何使用Environment.Exit和哪个整数放入其中.顺便说一下,每当我的表单调用formclosed或form closing事件时,我都会用this.Hide()
函数关闭应用程序.这会影响我的应用程序现在的行为吗?
我希望获得给定日期所在月份的第一天和最后一天.日期来自UI字段中的值.
如果我使用时间选择器,我可以说
var maxDay = dtpAttendance.MaxDate.Day;
Run Code Online (Sandbox Code Playgroud)
但我正试图从DateTime对象中获取它.所以,如果我有这个......
DateTime dt = DateTime.today;
Run Code Online (Sandbox Code Playgroud)
如何获得本月的第一天和最后一天dt
?
我有一个主窗体(让我们称之为frmHireQuote),它是主MDI窗体(frmMainMDI)的子窗口,当单击一个按钮时,它通过ShowDialog()显示另一个窗体(frmImportContact).
当用户在frmImportContact上单击"确定"时,我想将一些字符串变量传递回frmHireQuote上的某些文本框.
请注意,可能有多个frmHireQuote实例,显然重要的是我回到调用此frmImportContact实例的实例.
这样做的最佳方法是什么?
我有一个关于我应该在Windows窗体应用程序上使用的后台线程实现的选择的风格问题.目前我BackgroundWorker
在一个具有无限(while(true))
循环的表单上.在这个循环中,我WaitHandle.WaitAny
用来保持线程打盹直到感兴趣的事情发生.我等待的一个事件句柄是一个" StopThread
"事件,这样我就可以摆脱循环.来自我被覆盖的事件会发出此事件的信号Form.Dispose()
.
我读到的某个地方BackgroundWorker
真的是用于那些你不想将UI绑定到并且具有有限结束的操作 - 比如下载文件或处理一系列项目.在这种情况下,"结束"是未知的,并且仅在窗口关闭时.因此,使用后台线程而不是BackgroundWorker
为此目的更合适吗?