我一直在Visual Studio 2012中制作一个程序,它的特点是,当我把应用程序发给某人的时候,他们需要VS2012 Runtime,有时他们不知道在哪里下载或者需要什么(对于普通用户“xxx.dll丢失”是非常误导)。
我知道我的应用程序需要哪些依赖关系(fantom.dll [Lego Mindstorms]和VC ++ 2012 Redist)。
我想在应用程序启动时缺less这些库并为用户提供这些库的下载链接时显示一个对话框。
这有可能完成吗?
是的,你可以做这样的事情:
当然这意味着你的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)
,因为这是一个不好的做法,要求硬路径的安装位置。
这就是说,正如其他人所说的那样,它仍然是创建自己的安装发行版的最好方法。