我在Windows 7,64位的visual studio 2008中创建了一个解决方案。
有效。
当我将它移动到另一台机器上时,也赢得了7,64位,它几乎没有信息就崩溃了。
最初的问题是:
然后我实施了这个解决方案:
how to properly GetTypeFromProgID for visual studio 2008
但是,现在我的问题是当我在另一台机器上运行可执行文件时,程序会立即崩溃,并显示以下信息:
Description:
Stopped working
Problem signature:
Problem Event Name: APPCRASH
Application Name: EmailSalesVolumeSolution.exe
Application Version: 1.0.0.0
Application Timestamp: 508064dd
Fault Module Name: KERNELBASE.dll
Fault Module Version: 6.1.7601.17932
Fault Module Timestamp: 503285c2
Exception Code: e0434f4d
Exception Offset: 000000000000caed
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 1033
Read our privacy statement online:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409
If the online privacy statement is not available, please read our privacy statement offline:
C:\Windows\system32\en-US\erofflps.txt
我将代码包装在try/catch
中,但仍未收到正确的错误消息:
static void Main()
{
try
{
EnvDTE80.DTE2 dte;
object obj = null;
System.Type t = null;
// Get the ProgID for DTE 8.0.
t = System.Type.GetTypeFromProgID("VisualStudio.DTE.9.0",
true);
// Create a new instance of the IDE.
obj = System.Activator.CreateInstance(t, true);
// Cast the instance to DTE2 and assign to variable dte.
dte = (EnvDTE80.DTE2)obj;
// Register the IOleMessageFilter to handle any threading
// errors.
MessageFilter.Register();
// Display the Visual Studio IDE.
dte.MainWindow.Activate();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
// For example, get a reference to the solution2 object
// and do what you like with it.
// All done, so shut down the IDE...
dte.Quit();
// and turn off the IOleMessageFilter.
MessageFilter.Revoke();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
如何确定异常发生的确切位置以及异常是什么?
我确实有一些非托管代码:
using System;
using System.Collections.Generic;
using System.Text;
using EnvDTE;
using EnvDTE80;
using EnvDTE90;
using System.Runtime.InteropServices;
namespace EmailSalesVolumeSolution
{
public class MessageFilter : IOleMessageFilter
{
//
// Class containing the IOleMessageFilter
// thread error-handling functions.
// Start the filter.
public static void Register()
{
IOleMessageFilter newFilter = new MessageFilter();
IOleMessageFilter oldFilter = null;
CoRegisterMessageFilter(newFilter, out oldFilter);
}
// Done with the filter, close it.
public static void Revoke()
{
IOleMessageFilter oldFilter = null;
CoRegisterMessageFilter(null, out oldFilter);
}
//
// IOleMessageFilter functions.
// Handle incoming thread requests.
int IOleMessageFilter.HandleInComingCall(int dwCallType,
System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr
lpInterfaceInfo)
{
//Return the flag SERVERCALL_ISHANDLED.
return 0;
}
// Thread call was rejected, so try again.
int IOleMessageFilter.RetryRejectedCall(System.IntPtr
hTaskCallee, int dwTickCount, int dwRejectType)
{
if (dwRejectType == 2)
// flag = SERVERCALL_RETRYLATER.
{
// Retry the thread call immediately if return >=0 &
// <100.
return 99;
}
// Too busy; cancel call.
return -1;
}
int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee,
int dwTickCount, int dwPendingType)
{
//Return the flag PENDINGMSG_WAITDEFPROCESS.
return 2;
}
// Implement the IOleMessageFilter interface.
[DllImport("Ole32.dll")]
private static extern int
CoRegisterMessageFilter(IOleMessageFilter newFilter, out
IOleMessageFilter oldFilter);
}
[ComImport(), Guid("00000016-0000-0000-C000-000000000046"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
interface IOleMessageFilter
{
[PreserveSig]
int HandleInComingCall(
int dwCallType,
IntPtr hTaskCaller,
int dwTickCount,
IntPtr lpInterfaceInfo);
[PreserveSig]
int RetryRejectedCall(
IntPtr hTaskCallee,
int dwTickCount,
int dwRejectType);
[PreserveSig]
int MessagePending(
IntPtr hTaskCallee,
int dwTickCount,
int dwPendingType);
}
}
在给我带来麻烦的机器上安装VS 2008 express后,我现在得到了这个:
答案 0 :(得分:2)
尝试从例外打印更多内容:
catch(Exception e)
{
MessageBox.Show(e.Message + ":\n" + e.StackTrace);
}
您也可以使用它来捕获所有内部迭代:
string except = "Uncaught Exception: ";
while(e != null)
{
except += e.Message + ";\n";
e = e.InnerException;
}
如果程序崩溃没有异常,那么你需要尝试附加一个Debugger,
您需要在计算机上安装 Visual Studio ,或者能够使用远程桌面进行远程调试。 How to: Attach to a Running Process
在“调试”菜单上,选择“附加到进程”。
在“附加到进程”对话框中,找到所需的程序 从“可用进程”列表中附加到。
如果要调试的程序正在另一个程序上运行 计算机,使用限定符列表框选择远程计算机。 有关更多信息,请参见如何:选择远程计算机。
如果进程在其他用户帐户下运行,请选择 显示所有用户的进程复选框。
如果您通过远程桌面连接进行连接,请选择 在所有会话中显示流程复选框。
在“附加到”框中,确保要调试的代码类型 已列出。默认的自动设置尝试确定什么 要调试的代码类型。如果没有自动设置 合适:
单击“选择”。
在“选择代码类型”对话框中,单击“调试这些代码类型” 选择要调试的类型。
单击“确定”。
单击“附加”。
我看到您使用需要 .NET 4.5 的Type.GetTypeFromProgID
,请确保在PC上安装了 .NET 4.5 ,这会导致错误!
似乎t = System.Type.GetTypeFromProgID("VisualStudio.DTE.9.0", true);
投掷COMException表示“ VisualStudio.DTE.9.0 ”未在其他PC中注册。
您应该将 Microsoft Visual Studio 2008 DTE 添加为程序的依赖项。
答案 1 :(得分:2)
您也可以尝试订阅AppDomain.CurrentDomain.UnhandledException
事件:
AppDomain.CurrentDomain.UnhandledException +=
(sender, e) => MessageBox.Show(e.ExceptionObject.ToString());
在Main
方法的顶部执行此操作。
答案 2 :(得分:1)
您的DLL可能未在客户端计算机上注册。检查您正在调用COM对象的DLL并在管理命令提示符下执行Regsvr32 YouComDllName.dll
(右键单击命令提示符图标并执行Run as Administrator
。具体取决于您使用的是32位还是64位应用程序,您可能需要在C:\Windows\System32
或C:\Windows\SysWOW64
中使用Regsvr32的副本(在64位版本在system32中,而32位版本在SysWOW64中以反向方式)
如果仅重新设置计算机上的DLL无效,请在计算机上的程序上运行Dependancy Walker。当您获得程序触及的所有DLL时,请检查客户端计算机是否缺少任何DLL。您调用的DLL可能在那里,但 依赖于 的DLL可能不存在。
答案 3 :(得分:0)
唯一有效的解决方案是安装Visual Studio。一旦安装完毕,我就得到了确切的例外。