使用PInvoke在Azure Service Fabric中加载dll

时间:2016-11-23 01:11:44

标签: azure azure-service-fabric

所以在我的应用程序中,我有一个使用Pinvoke来调用win32 dll中定义的函数的actor。我还有一个前端Web服务,可以调用这些actor。

当我在本地运行时,一切都很完美。找到并正确加载win32 dll,我的演员可以从那里调用函数。

但是,当我将解决方案部署到Azure时,我只是在actor尝试加载dll时出现内部服务器错误。没有描述性错误所以我认为演员要么找不到dll,要么找不到其依赖关系。 我已经尝试使用依赖walker来找出依赖关系。大多数是典型的Windows二进制文件,但vcruntime140.dll除外。我通过右键单击项目然后导航到添加>现有项目然后编辑"复制到输出目录"我将此作为资源文件添加到VS项目中。解决方案资源管理器中资源的属性为"始终复制"。这是将本机dll部署到服务结构的正确方法吗?我也在发布模式下运行,因此不需要任何调试dll。

一些额外的信息 - 我的项目最初是从一个web api项目移植而来的,当我在发布模式下在Azure上托管我的web api时,我能够成功调用win32 dll中的函数。

如果我需要提供一些额外信息,请告诉我

1 个答案:

答案 0 :(得分:1)

所以我明白了。对于可能在以后遇到这种情况的人,可以采用以下方式:

当我使用依赖walker时,我看到我立即依赖vcruntime140.dll和msvcp140.dll。但是,通过深入挖掘,我注意到msvcp140.dll对concrt140.dll有额外的依赖性。当我将其复制到我的服务器的bin文件夹时,我再也没有收到内部服务器错误,我可以调用我的win32 dll。

所有这些都是visual studio c ++可再发行二进制文件,通常可以在这里找到" C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ redist \ x64 \ Microsoft.VC140.CRT"。