【发布时间】:2019-01-29 15:29:32
【问题描述】:
我想在第一个应用程序窗口启动之前检查 .dll、.png 和 .exe 文件是否存在,但问题是无论我如何尝试它都无法在事件查看器中抛出错误,而不是我的消息。
我的 IsResourceExist 方法:
private static bool IsResourceExist(string fileName)
{
var process = Process.GetCurrentProcess();
string path = process.MainModule.FileName.Replace("\\" + process.ProcessName + ".exe", "");
try
{
if (!File.Exists(Path.Combine(path, fileName)))
{
MessageBox.Show("Unable to load " + fileName + " library\nReinstall application and try again", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
return false;
}
return true;
}
catch
{
return false;
}
}
简单的方法没什么花哨的,在正常情况下(当文件实际存在时工作正常)
private static bool CheckLibrarys()
{
if (!IsResourceExist("MyLib.dll")) return false;
//Other resources checking same way
return true;
}
此方法检查所有应用程序所需的资源,也适用于正常情况(当所有文件都存在时)
我认为这是应用程序调用的第一行代码,在文件存在时有效
public App()
{
if (!CheckLibrarys()) Environment.Exit(0);
}
当我在事件查看器中删除 MyLib.dll 文件时,它会抛出:
描述:进程因未处理的异常而终止。 异常信息:System.IO.FileNotFoundException 在 myapp.App.CheckLibrarys() 在 myapp.App..ctor() 在 myapp.App.Main()
这真的是某种 .Net Framework 玩笑吗?我在这里缺少什么?
编辑 1: 即使使用 OnStartup 覆盖也是同样的情况
protected override void OnStartup(StartupEventArgs e)
{
if (!CheckLibrarys()) Environment.Exit(0);
base.OnStartup(e);
}
EDIT 2 扩展@bic 答案,但应用仍然无法启动,也不会抛出 mylib 丢失的任何错误
private static bool CheckLibrarys()
{
if (!IsResourceExist("MyLib.dll")) { return false; }
else
{
if (!MyLib.Init.ReturnOnlyTrue())
{
MessageBox.Show("Wrong loaded library, reinstall application and try again", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
return false;
}
}
//Other resources checking same way
return true;
}
在我的 MyLib Init 类中 ReturnOnlyTrue() 方法如下所示:
public static bool ReturnOnlyTrue()
{
return true;
}
【问题讨论】:
-
您可以覆盖应用程序类的 OnStartup 方法,然后在那里使用您的逻辑。如果需要,我可以提供一个例子
-
如果项目中引用了dll,则不能丢失,否则无法解析项目引用。如果您从项目引用中删除它并在运行时简单地加载它,那么您应该不会遇到这个问题。
-
是的 mylib.dll 被引用了,所以我需要做其他事情来检查它们吗?
-
您是否使用调试器单步执行了代码?异常发生在哪一行? MyDLL.dll 中定义的 IsResourceExist 方法是否偶然?