【问题标题】:Trying to load unmmanaged c++ dll in azure尝试在 azure 中加载非托管 c++ dll
【发布时间】:2016-01-01 19:52:09
【问题描述】:

我正在尝试从我的 asp.net mvc Web 应用程序调用我的非托管 dll。 当我从 localhost 调用这个 dll 时,它工作得很好。 当将应用程序发布到 azure 并尝试调用这个 dll 时,我得到了这个:

Error:System.DllNotFoundException: Unable to load DLL 'SerenityConfigCodec.dll': A dynamic link library (DLL) initialization routine failed. (Exception from HRESULT: 0x8007045A).

  1. 我成功调用了 azure 中的一个简单 dll(不是我的)。根据 Microsoft azure 文档。
  2. 我在我的 dll 上使用依赖项遍历器来了解我在 azure 中需要的 dll 并添加它们。

我有一些理论认为我的 dll 需要一些天蓝色的额外 dll 依赖 walker 不会告诉我它们。 或者我可能需要将我的网站连接到 iis 并尝试使用 iisreset 导致 azure 中的 .bin 文件夹在运行时被锁定并让 iisreset 解锁。

【问题讨论】:

    标签: c++ asp.net-mvc azure dll


    【解决方案1】:

    听起来 Azure 找不到您引用的 DLL。

    此 DLL 是否作为依赖项添加到您的项目中?还是作为 Nuget 包?

    如果是依赖项,则有两种可能的解决方案,具体取决于您的发布方法:

    • 如果您使用 Web Deploy 发布,请添加 Copy Local to True(右键单击 > 从 Visual Studio 发布)
    • 如果您通过持续集成和存储库链接(GitHub / Bitbucket / VSO / 等)发布,将 DLL 文件添加到您的存储库(可能在一个专门用于此的文件夹)并使用该文件夹路径在您的项目中引用它。

    如果是 Nuget 包,如果你使用 Web Deploy 会失败(除非你将 Copy Local 设置为 True),如果你通过持续集成进行部署,Kudu 会负责下载部署过程中的所有包。

    【讨论】:

    • 我无法从引用选项卡中添加 dll,因为它是非托管 dll,所以我将它添加到项目中(添加现有项目),这样它可以正常使用简单的 dll,但可以使用我的 dll我认为我需要更多的 dll 在 azure 依赖 walker 不会告诉我它们。真的很沮丧):
    • 有时我会收到另一个错误:HRESULT 异常:0x8007007E。我不知道错误之间有什么区别。
    • 哪里可以对“复制本地为真”进行微调?
    【解决方案2】:

    我通过将已编译的非托管 DLL 文件添加到托管项目中解决了这个问题,因此它将包含在发布包中。由于添加的文件是调试或发布 DLL,因此我必须手动编辑 .csproj 文件以根据我是构建调试还是发布托管 DLL 有条件地复制调试或发布构建 DLL。这反过来会在我每次加载项目时生成警告,但构建器会正确处理它。而且我需要记住重新构建托管 DLL 以让它接收对非托管 DLL 的更改,因为它并没有自动为我执行此操作。

    根据您使用的 VS 版本,您可能还需要安装 C++ 运行时 DLL。

    0x8007045A 错误表明找到了 DLL 但 init 失败,而 0x8007007E 错误提到对另一个答案的注释表明它找不到要加载的 DLL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 2014-04-16
      相关资源
      最近更新 更多