试图在azure中加载unmmanaged c ++ dll

时间:2015-12-29 12:32:37

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

我试图从我的asp.net mvc网络应用程序调用我的非托管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上使用依赖walker来了解azure中需要的dll并添加它们。
  3. 我有一些理论认为我的dll需要一些额外的dll,因为依赖步行者不会告诉我它们。 或者我可能需要将我的网站连接到iis并尝试使用iisreset导致azure中的.bin文件夹在运行时锁定并让iisreset解锁。

2 个答案:

答案 0 :(得分:0)

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

此DLL是否在项目中作为依赖项添加?还是作为Nuget包裹?。

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

  • 如果使用 Web部署发布<右键>&gt;从Visual Studio发布
  • ,请添加将本地复制为True
  • 如果您通过持续集成和指向存储库的链接(GitHub / Bitbucket / VSO / etc)发布,将DLL文件添加到存储库(可能在特别针对该文件夹的文件夹)并使用该文件夹路径在项目中引用它。

如果是Nuget软件包,如果您使用Web Deploy,它将失败(除非您将Copy Local设置为True),如果您通过Continuous Integration进行部署,Kudu会负责下载部署过程中的所有软件包。

答案 1 :(得分:0)

我通过将已编译的非托管DLL文件添加到托管项目来解决了这个问题,因此它将包含在发布包中。由于添加的文件是调试版或发布版DLL,我必须手动编辑.csproj文件,以有条件地复制调试版或发布版DLL,具体取决于我是否构建调试或发布托管DLL。这反过来每次加载项目时都会生成警告,但构建器会正确处理它。我需要记住重建托管DLL以使其能够接收对非托管DLL的更改,因为它并没有自动为我做这些。

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

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