C++ 当出现“时显示(自定义)错误”;“必需”;运行库不存在?

C++ 当出现“时显示(自定义)错误”;“必需”;运行库不存在?,c++,windows,winapi,visual-c++,dependencies,C++,Windows,Winapi,Visual C++,Dependencies,我在Visual Studio 2012中制作了一个程序,它带来的是,当我将应用程序发送给某人时,他们需要VS2012运行时,有时他们不知道在哪里下载或需要什么(对于普通用户,“xxx.dll丢失”非常误导) 我确切地知道我的应用程序需要哪些依赖项(fantom.dll[Lego Mindstorms stuff]和VC++2012 Redist) 我想在应用程序启动时显示这些库丢失时的对话框,并为用户提供这些库的下载链接 这可能实现吗?不可能,但您可以为您的程序创建安装程序。该错误是在程序加载

我在Visual Studio 2012中制作了一个程序,它带来的是,当我将应用程序发送给某人时,他们需要VS2012运行时,有时他们不知道在哪里下载或需要什么(对于普通用户,“xxx.dll丢失”非常误导)

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

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


这可能实现吗?

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


您可以尝试这样做:

当然,您可以验证部署的系统上是否存在依赖项。我想到了几件事

  • 通过调用
    AppDomain.AssemblyResolve()
    ,可以查看程序集是否在运行的系统上被识别

  • 另一个更原始的选项是调用
    文件.Exists(此处为程序集路径)
    测试,但我建议不要这样做,因为需要硬路径安装位置是一种不好的做法


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

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

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

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

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

    您的程序不能提供所需的redist和DLL吗?30kb的程序应该包含30MB的运行时文件:P除了包含它们或readme.txt之外,真的没有其他方法吗?那么你是建议用户下载30Mb的运行时文件?这与你为他们提供的有什么不同,特别是如果它不可能出现在他们的机器上,比如Mindstorm dll。有些用户已经有了这些库,那么为什么还要在包中添加额外的30 mb:这是一个公平的观点;谁是你的目标受众,你是如何发送给他们的?是的,DLLI不认为这会有很大的用处,标签表明C++应用程序需要.NET也不太可能有帮助:哇!通过Windows标签组,将C++视为C +。笨手笨脚的我