我正在运行一个(主要是)单线程程序(有一个主线程可以完成所有事情,其他人只能读取内容)。我可以通过一个小的更改(我更改了表单的文本和另一个表单的Tab键顺序)使应用程序在VS2008中正常运行,但我不能再让它在调试器之外工作。有谁知道会导致什么?
澄清:使用调试器(F5)启动的发布模式有效。调试模式,使用调试器(F5)工作。在VS外部或使用Ctrl + F5启动的调试可执行文件或释放可执行文件失败。
它使用微软的Virtual Earth 3D,它似乎在“希望之环”(加载环)即将完成时崩溃。
事件日志说:“.NET运行时版本2.0.50727.3053 - 致命执行引擎错误(000006427F44AA6E)(80131506)”
罪魁祸首:这一行:
this.loader = PlugInLoader.CreateLoader(this.globeControl.Host);
导致失败。但是,正在运行的表单使用完全相同的行而没有问题。这条线是程序运行的必要条件。我不知道它在做什么。
另一个主管错误似乎在.NET框架内。应用程序在另一台机器上运行,尝试重新安装更新:并没有什么区别,虽然当我修复VS时它仍然告诉我Visual Studio崩溃了,即使我没有运行它。
错误的 几分钟后,当我启动程序时,我得到: 应用程序生成了无法处理的异常。
进程ID = 0x9CC(2508),线程ID = 0xF0C(3852)。
单击“确定”终止该应用程序 单击CANCEL以调试应用程序。
反汇编是奇怪的:
0000000077EF2A90 int 3
0000000077EF2A91 int 3
0000000077EF2A92 int 3
0000000077EF2A93 int 3
0000000077EF2A94 int 3
0000000077EF2A95 int 3
0000000077EF2A96 xchg ax,ax
0000000077EF2A9A xchg ax,ax
0000000077EF2A9E xchg ax,ax
0000000077EF2AA0 int 3 <-- Crashes here
0000000077EF2AA1 ret
它重复相同的代码块几次(减去与自身交换的斧头)
除了我的电脑,它已经在我测试过的每台机器上运行,除了我的机器上的VM,它不会安装.NET框架,因为安装程序从0字节中下载0字节用于框架)...可爱的窗户。
答案 0 :(得分:7)
我遇到类似的问题,时间冲突导致失败,我的调试(断点和单步执行代码)迫使代码以正确的顺序运行。
答案 1 :(得分:5)
尝试从Release版本中取消优化(在项目设置中)并查看是否有帮助。
答案 2 :(得分:5)
我修复了它,.NET 2.0框架已经损坏,当我重新安装它时,一切都神奇地开始了。
答案 3 :(得分:4)
我无法告诉你究竟是什么问题,但是你可以做些什么来弄清楚究竟发生了什么。我假设您使用的是VS2008或2005。
似乎在执行期间有一段时间抛出了win32异常,但不管怎么说,您将从调试器获得一条或多条消息,说明发生了什么样的异常以及在哪里发生。在大多数情况下,这些消息非常清楚到底出了什么问题
编辑:我忘记提到的一件事是,还必须打开非托管调试,例如here (when you start program directly from IDE)或here (when you attach to running process)
答案 4 :(得分:2)
Here是一篇包含该错误的支持文章。这适用吗?
也许调试器正在吃掉VE3D API正在抛出的一个消息。在VS中,执行ctrl + alt + e并在抛出任何异常时将其更改为break。这可以是tedius b / c它会破坏你所有的try catch块,但它可能会给你一些信息。
Here是一些信息。关于那个PlugInLoader。它似乎暗示它必须从FirstFrameRendered事件处理程序调用。也许你的一个表格是这样做而一个不是吗?
答案 5 :(得分:1)
搜索#if(DEBUG)指令? 搜索Debug.Assert(?
你有google搜索错误吗?我发现this线程(诚然不是非常有帮助)
答案 6 :(得分:1)
我们用MSFT发现并解决了这个问题,我们在VSTO开发中遇到了这个问题。 从MSFT应用以下补丁。
答案 7 :(得分:0)
我认为还有一件事就是使用WinDbg来尝试调试它。以下是一些如何使用它的链接:
考虑一下,它也可能是某种服务或某种冲突。尝试停止所有不需要的服务并关闭不需要的程序(包括启动程序),看看会发生什么。
答案 8 :(得分:0)
我曾经使用插件系统遇到与相同行为类似的问题。从MarshalByRef
- 对象加载插件时(请参阅下面的示例代码),似乎.NET为加载的程序集创建了一个新的AppDomain或Context。 (任何人都可以证实这一点吗?我没有找到任何关于此的消息来源。)
public class ProxyAssemblyLoader : MarshalByRefObject {
public Assembly GetAssembly(string path) {
return Assembly.LoadFrom(path);
}
}
此外,在我的情况下,插件会加载mscorlib
的不同版本。 (我的应用程序是CLR2,加载的是CLR4)之后我通过反射使用了插件,并尝试访问从其他应用程序域加载的新mscorlib的值。通常两者都应该可用,因为mscorlib是一个常用的程序集,只加载一次(参见Global Assembly Cache)。但它似乎好像不是这样。但总的来说是微软advises to avoid那个。
我还没弄清楚问题是什么,但我想出了导致应用程序崩溃而没有任何提示的调用。 为什么没有任何提示?它在没有任何提示的情况下崩溃,因为抛出的异常仅在“其他”应用程序域中可用,并且不适用于主/默认应用程序域。
所采取的操作只是将另一个appdomains程序集的值隐式复制到默认应用程序域中的本地无类型值(object
)。由于不同版本的程序集,这足以获得类型标识不匹配错误。似乎Visual Studio可以处理它,但如果应用程序独立运行它会崩溃。
这也可以解释为什么需要重新安装.NET。也许您安装的.NET-Framework是测试版或类似的东西,其中包含一些细微差别。
总之,该问题的一些通用解决方案可能是:
答案 9 :(得分:0)
我的一个控制台应用程序遇到了完全相同的问题。我确定是我的防病毒软件(Avast)造成了这个问题。
将BIN
文件夹添加到排除列表中并禁用&#34; DeepScreen&#34;。
然后重建项目并再试一次!