Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取“文件名”的文件名;找不到模块";错误对话框_C#_.net_Directx - Fatal编程技术网

C# 如何获取“文件名”的文件名;找不到模块";错误对话框

C# 如何获取“文件名”的文件名;找不到模块";错误对话框,c#,.net,directx,C#,.net,Directx,当我们的C#应用程序缺少依赖项时,它会报告此“找不到模块”错误对话框。不幸的是,此对话框没有包含找不到的文件名。在本例中,缺少的依赖项是DirectX dll D3DCompiler_43.dll。如果客户报告“找不到模块”,这不是很有帮助,但是如果他们报告找不到文件名,这至少会给我们一个线索 我们能否捕获此异常并生成一个错误对话框,其中包含未找到的文件名?既然它发生在应用程序启动的早期(我相信是在main之前),我们该怎么做呢 让您的客户在您的exe上运行,将结果保存到文件中并将此文件发送给您

当我们的C#应用程序缺少依赖项时,它会报告此“找不到模块”错误对话框。不幸的是,此对话框没有包含找不到的文件名。在本例中,缺少的依赖项是DirectX dll D3DCompiler_43.dll。如果客户报告“找不到模块”,这不是很有帮助,但是如果他们报告找不到文件名,这至少会给我们一个线索

我们能否捕获此异常并生成一个错误对话框,其中包含未找到的文件名?既然它发生在应用程序启动的早期(我相信是在main之前),我们该怎么做呢


让您的客户在您的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(){

    } }

编辑:我看到您的异常来自消息处理程序。上述代码编辑可以(也应该)应用于所有条目方法,其中包括处理代码外部事件的所有事件处理程序。上面的崩溃屏幕可能会在各种异步执行的处理程序代码中显示异常。例如,具有异步调用的按钮处理程序应具有两个try/catch,以防止出现崩溃窗口:

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(){

    } }

编辑:我看到您的异常来自消息处理程序。上述代码编辑可以(也应该)应用于所有条目方法,其中包括处理代码外部事件的所有事件处理程序。上面的崩溃屏幕可能会在各种异步执行的处理程序代码中显示异常。例如,具有异步调用的按钮处理程序应具有两个try/catch,以防止出现崩溃窗口:

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进程监视器: 将其配置为