【问题标题】:Running App on dev machine won't run when deployed部署时在开发机器上运行应用程序不会运行
【发布时间】:2014-01-09 00:38:21
【问题描述】:

我有一个简单的 C# 4.5.1 x64 应用程序,它通过 /clr C++ 包装器调用非托管 dll。应用程序在我的开发机器上运行良好。如果我复制到 Windows Server 2008 或 Windows Server 2012(安装了 Framework 4.5.1),我会收到包装程序无法加载的错误。

我已经在部署机器上安装了 DependencyWalker,我得到了这个:

LoadLibraryExW("MyWrapper.dll", 0x000.., LOAD_WITH_ALTERED_SEARCH_PATH) called from ...
Loaded "MyWrapper.dll" at ... Successfully hooked module.
Loaded "XX.dll" at ... Successfully hooked module. (Dependency for MyWrapper.dll)
Loaded "YY.dll" at ... Successfully hooked module. (Dependency for MyWrapper.dll)
Unloaded "MyWrapper.dll"
Unloaded "XX.dll"
Unloaded "YY.dll"
LoadLibraryExW("MyWrapper.dll", 0x000.., LOAD_WITH_ALTERED_SEARCH_PATH) returned null. The specified module cannot be found.

有谁知道为什么所有东西都加载然后卸载然后找不到?

【问题讨论】:

  • 您确定该运行时已安装在部署机器上吗?这可能会帮助stackoverflow.com/questions/9052694/…
  • 看起来包装器确实加载了,但是在加载您的应用程序之后然后去卸载它们。是否发生了其他错误?你的代码是什么样的?
  • @dousin .NET Framework 运行时肯定已安装。
  • @simon_at_rcl 我看不到。我没有在我的代码中调用 LoadLibraryExW - 我只是对我的包装器有一个直接的 .NET 引用。
  • 如果您使用非托管 c++ dll,它会链接到 msvcr。它与.net 无关。它与 Visual Studio 一起自动安装在开发人员机器上。您必须重新分发它并与您的应用程序一起安装在部署机器上。 Google for vcredist.exe 用于您当前的 Visual Studio 版本。它的副本也驻留在开发人员机器上(在我的 vs2008 情况下:在 %ProgramFiles%\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages 中)

标签: c# c++ dependencies


【解决方案1】:

确保您已安装所有必要的可再发行组件 (vcredist.exe) 并部署发布版本。

任何非托管 c/c++ dll 以及 c++/cli dll 链接到 msvcr。它与 Visual Studio 一起自动安装在开发人员机器上。它必须与应用程序一起安装在部署机器上。确保重新分发与您的 VS 版本(和服务包)相对应的正确 vcredist.exe 版本。对于 vs2008,它位于 %ProgramFiles%\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages 中。注意:如果在 c# 中使用 LoadModule() 加载或使用 [DllImport("Sample.dll")] 加载方法,则依赖项遍历器不会显示丢失的 dll。在这种情况下,直接在 Dependency walker 中打开非托管 dll 并检查缺失的 deps。确保非托管 dll 在您应用的搜索路径中。

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多