我遇到了一个很大的问题。我正在编写WFA + C ++ / CLI DLL应用程序。一切都很好,直到我不得不把它发送给我的朋友。每次他从bin / debug(+附加的dll和xml文件)执行exe文件时都没有发生任何事情(他没有安装Visual Studio)。问题不会发生在我身上。在我的电脑上一切正常。
我注意到的是(经过几个小时查找解决方案),这是关键时刻:
log = new StreamWriter("log.txt", true);
log.WriteLine("3c");
log.Close();
materialTypeComboBox.SelectedIndex = 0;
log = new StreamWriter("log.txt", true);
log.WriteLine("3d");
log.Close();
每次我的朋友执行此操作时,“3c”是我的简单日志文件中的最后一行。如果我评论这个,应用程序崩溃
foreach (RadioButton item in someGroupBox.Controls.OfType<RadioButton>()) { ... }
似乎WFA的控制会产生这种效果,但它怎么可能呢? 我尝试使用installShield项目改变目标框架形式3.5到4.5.1,在Debug和Relase模式下构建项目,x86,x64(我以为我在发送应用程序时错过了一些引用),一键安装程序,创建空项目和粘贴来源 - 没有任何成功。
怎么可能?没有例外,没有消息框,没有。只需点击即可。 有人知道一些解决方案吗?
答案 0 :(得分:1)
Windows Forms因其能够以静默方式吞下异常而闻名。我强烈建议记录未处理的异常。要记录未处理的异常,请执行以下操作:
Application.ThreadException += new ThreadExceptionEventHandler(UnhandledUIException);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledException);
private static void UnhandledUIException(object sender, ThreadExceptionEventArgs e)
{
// Log exception
}
private static void UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// Log exception
}
信息:http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx
信息:http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx
答案 1 :(得分:-1)
解决:
问题在于DLL - 使用Dependency Walker我发现我的DLL需要运行msvcr120.dll,甚至将它包含到项目输出文件夹也无济于事,并且msvcr也会导致x84 / x64不匹配错误。重新编译DLL解决了问题:
静态链接DLL 确保为Release和Debug解决此问题。步骤略有不同。
发布
在Visual Studio中,我转到了项目属性。我变了 我的配置发布。我去了配置属性| C / C ++ |代码生成查看运行时库设置。它是 设置为:多线程DLL(/ MD)将其更改为: 多线程(/ MT)重建。调试几乎完全相同 释放。
调试
在Visual Studio中,我转到了项目属性。我换了我的 配置到调试。我去了配置属性| C / C ++ |代码生成查看运行时库设置。它被设置为 这个:多线程调试DLL(/ MDd)将其更改为: 多线程调试(/ MTd)重建调试
http://www.rhyous.com/2010/09/16/avoiding-the-msvcr100-dll-or-msvcr100d-dll/