3

我一直在 Visual Studio 2012 中制作程序,随之而来的是当我将我的应用程序发送给某人时,他们需要 VS2012 运行时,有时他们不知道在哪里下载或他们需要什么(对于普通用户“xxx.dll is missing”非常具有误导性)。

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

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

这有可能实现吗?

4

4 回答 4

1

是的,您可以执行以下操作:

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

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

于 2013-05-17T08:22:51.960 回答
1

不,这是不可能的,但您可以为您的程序创建安装程序。在加载程序期间,在代码执行之前引发错误......

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

于 2013-05-16T14:51:13.730 回答
1

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

于 2013-05-16T19:34:13.727 回答
0

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

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

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

也就是说,正如其他人所说,它仍然是迄今为止为自己创建安装发行版的最佳方法。

于 2013-05-16T18:01:26.777 回答