当“required”运行时库不存在时,显示(自定义)错误?

我一直在Visual Studio 2012中制作一个程序,它的特点是,当我把应用程序发给某人的时候,他们需要VS2012 Runtime,有时他们不知道在哪里下载或者需要什么(对于普通用户“xxx.dll丢失”是非常误导)。

我知道我的应用程序需要哪些依赖关系(fantom.dll [Lego Mindstorms]和VC ++ 2012 Redist)。

我想在应用程序启动时缺less这些库并为用户提供这些库的下载链接时显示一个对话框。

这有可能完成吗?

是的,你可以做这样的事情:

  1. 将您的二进制代码中的所有代码移动到一个DLL中。
  2. 创建一个使用LoadLibrary动态加载DLL并使用FreeLibrary卸载它的EXE。
  3. 如果LoadLibrary失败,请检查是否由于缺少DLL,如果是,则显示一个MessageBox /您的自定义消息并退出。

当然这意味着你的EXE项目不能依赖于运行时本身 – 这应该不是问题,因为你只需要调用3个win32 API。

不,这是不可能的,但你可以为你的程序创建一个安装程序。 加载程序期间,在执行代码之前抛出错误…

你可以试试这个: http : //www.codeproject.com/Articles/24187/Creating-an-Installer

我不能说动态地测试VS2012运行时,但你一定可以动态地验证fantom.dll。 而不是直接静态链接到DLL,您可以动态加载它。 您可以配置项目以在运行时延迟加载DLL,然后提供延迟加载回调处理程序,如果延迟加载失败,RTL将调用该回调函数。 或者,您可以直接跳过延迟加载功能并手动加载DLL,方法是直接调用LoadLibrary()GetProcAddress()

当然,您可以验证部署的系统上是否存在依赖关系。 有几件事情浮现在脑海里

  • 您可以通过调用AppDomain.AssemblyResolve()来查看程序集是否在正在运行的系统上被识别。 进一步阅读这里

  • 另一个更原始的选择是调用一个File.Exists(your assembly path here)测试,但我建议不File.Exists(your assembly path here) ,因为这是一个不好的做法,要求硬路径的安装位置。

这就是说,正如其他人所说的那样,它仍然创建自己的安装发行版的最好方法。