C# 如何获取“文件名”的文件名;找不到模块";错误对话框
当我们的C#应用程序缺少依赖项时,它会报告此“找不到模块”错误对话框。不幸的是,此对话框没有包含找不到的文件名。在本例中,缺少的依赖项是DirectX dll D3DCompiler_43.dll。如果客户报告“找不到模块”,这不是很有帮助,但是如果他们报告找不到文件名,这至少会给我们一个线索 我们能否捕获此异常并生成一个错误对话框,其中包含未找到的文件名?既然它发生在应用程序启动的早期(我相信是在main之前),我们该怎么做呢C# 如何获取“文件名”的文件名;找不到模块";错误对话框,c#,.net,directx,C#,.net,Directx,当我们的C#应用程序缺少依赖项时,它会报告此“找不到模块”错误对话框。不幸的是,此对话框没有包含找不到的文件名。在本例中,缺少的依赖项是DirectX dll D3DCompiler_43.dll。如果客户报告“找不到模块”,这不是很有帮助,但是如果他们报告找不到文件名,这至少会给我们一个线索 我们能否捕获此异常并生成一个错误对话框,其中包含未找到的文件名?既然它发生在应用程序启动的早期(我相信是在main之前),我们该怎么做呢 让您的客户在您的exe上运行,将结果保存到文件中并将此文件发送给您
让您的客户在您的exe上运行,将结果保存到文件中并将此文件发送给您 让您的客户在exe上运行,将结果保存到文件中并将此文件发送给您 我认为您无法通过编程实现这一点。但是,如果您有权访问机器,您可以打开“全局标志”来显示所谓的“加载程序快照”(),至少可以识别问题
这里有一篇关于它的文章解释了如何做到这一点:我认为您无法通过编程实现这一点。但是,如果您有权访问机器,您可以打开“全局标志”来显示所谓的“加载程序快照”(),至少可以识别问题
下面是一篇关于它的文章,解释了如何执行此操作:尝试订阅
AssemblyResolve
事件,当应用程序找不到所需的程序集时,会触发该事件。在该事件的处理程序中,您可以提供自己的消息框,其中包含程序集的名称和您喜欢的任何其他信息
public static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(AssemblyNotFoundEventHandler);
InvokeExternalType();
}
private static Assembly ResolveEventHandler(object sender, ResolveEventArgs args)
{
MessageBox.Show("Error, can't find assembly: " + args.Name, "Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
return null;
}
private static void InvokeExternalType()
{
MyClass doc = ... // from an external assembly.
}
有一个问题是,外部类型(可能属于缺少的程序集)不能在主方法中使用,否则不会触发事件。必须在代码中以单独的方法进一步调用它,如上面的代码示例所示。尝试订阅
AssemblyResolve
事件,当应用程序找不到所需的程序集时会触发该事件。在该事件的处理程序中,您可以提供自己的消息框,其中包含程序集的名称和您喜欢的任何其他信息
public static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(AssemblyNotFoundEventHandler);
InvokeExternalType();
}
private static Assembly ResolveEventHandler(object sender, ResolveEventArgs args)
{
MessageBox.Show("Error, can't find assembly: " + args.Name, "Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
return null;
}
private static void InvokeExternalType()
{
MyClass doc = ... // from an external assembly.
}
有一个问题是,外部类型(可能属于缺少的程序集)不能在主方法中使用,否则不会触发事件。必须在代码中以单独的方法进一步调用它,如上面的代码示例所示。如果可以修改代码并重新部署:
- 创建一个新的启动类(带有Main()),确保在项目属性中选择该类
- 确保系统外没有来自启动类的“使用”和外部引用
- 在调用上一个startup类的主
- 在消息框(或调试日志)中打印出异常和所有内部异常 公共类MyNewEntryClass{ 公共静态void Main(){ } }
private void Button_Clicked(object sender, EventArgs arg){
try{
Action<string> asyncCall = (s)=>{
try{
//...exception here will cause crash
// as it's not handled in Button_Clicked
} catch (Exception xOnAsyncThread){
}
};
asyncCall.BeginInvoke("outahere",null,null);
} catch (Exception xOnUIThread){
}
}
private void按钮\u已单击(对象发送方,事件args arg){
试一试{
操作异步调用=(s)=>{
试一试{
//…此处的异常将导致崩溃
//因为它不是在按钮中处理的
}捕获(线程异常){
}
};
asyncCall.BeginInvoke(“outahere”,null,null);
}捕获(异常xOnUIThread){
}
}
上述语句同样适用于windows消息处理—它只是外部事件的另一个事件处理程序
如果无法修改代码并重新部署,请使用Sysinternals进程监视器:
将其配置为监视应用程序并突出显示文件未找到事件(有关详细信息,请参阅其文档)
如果ProcessMonitor太多复制异常消息中的所有内容并按排除进行-加载的内容不是问题如果您可以修改代码并重新部署:
- 创建一个新的启动类(带有Main()),确保在项目属性中选择该类
- 确保系统外没有来自启动类的“使用”和外部引用
- 在调用上一个startup类的主
- 在消息框(或调试日志)中打印出异常和所有内部异常 公共类MyNewEntryClass{ 公共静态void Main(){ } }
private void Button_Clicked(object sender, EventArgs arg){
try{
Action<string> asyncCall = (s)=>{
try{
//...exception here will cause crash
// as it's not handled in Button_Clicked
} catch (Exception xOnAsyncThread){
}
};
asyncCall.BeginInvoke("outahere",null,null);
} catch (Exception xOnUIThread){
}
}
private void按钮\u已单击(对象发送方,事件args arg){
试一试{
操作异步调用=(s)=>{
试一试{
//…此处的异常将导致崩溃
//因为它不是在按钮中处理的
}捕获(线程异常){
}
};
asyncCall.BeginInvoke(“outahere”,null,null);
}捕获(异常xOnUIThread){
}
}
上述语句同样适用于windows消息处理—它只是外部事件的另一个事件处理程序
如果无法修改代码并重新部署,请使用Sysinternals进程监视器:
将其配置为