.NET 6 AWS Lambda访问网络驱动器遇DllNotFoundException问题求助
解决方案:AWS Lambda .NET6 访问网络驱动器的问题
问题根源
AWS Lambda默认的.NET运行环境基于Linux,而mpr.dll是Windows系统独有的网络资源管理库,Linux环境完全无法识别和加载它——哪怕你把dll放进项目目录也没用,底层系统不支持Windows动态链接库。
可行解决方案
1. 替换为跨平台的网络共享访问方式(推荐)
放弃依赖Windows挂载网络驱动器的逻辑,改用跨平台的SMB协议客户端库直接访问共享文件,比如SMBLibrary(可通过NuGet安装)。这种方式无需挂载驱动器,直接通过协议读写文件,完全兼容Linux环境。
示例代码片段:
using SMBLibrary; using SMBLibrary.Client; // 连接SMB共享 using var client = new SMB2Client(); client.Connect("smb-server-ip", SMBTransportType.DirectTCPTransport); client.Login("domain\\username", "password"); // 获取共享目录 var share = client.TreeConnect("\\\\smb-server-ip\\share-name", out _); if (share is FileShare fileShare) { // 下载文件到Lambda临时目录 using var fileStream = fileShare.OpenFile("target-file-path", FileAccess.Read, FileShare.Read); using var localStream = File.Create("/tmp/downloaded-file.txt"); fileStream.CopyTo(localStream); }
如果是云厂商的文件共享(如Azure Files),直接用官方SDK(比如Azure.Storage.Files.Shares)更稳定,还能集成云服务的权限管理。
2. 用Windows容器部署Lambda
如果必须保留原有的mpr.dll依赖逻辑,可以把Lambda打包成Windows容器镜像部署:
- 基于AWS提供的Windows Lambda基础镜像(如
public.ecr.aws/lambda/dotnet:6-windowsservercore-ltsc2022)构建你的镜像 - 将代码和依赖(包括
mpr.dll)打包进镜像 - 上传镜像到AWS ECR
- 创建Lambda函数时选择「容器镜像」类型,指定Windows运行时
⚠️ 注意:Windows容器的Lambda冷启动时间远长于Linux,成本也更高,仅适合低频率调用的场景。
3. VPC内代理中转(针对企业内部SMB共享)
如果要访问的是企业内网的SMB共享,Lambda无法直接打通内网的话,可以在VPC里部署一台Windows EC2实例作为代理:
- EC2实例挂载目标网络驱动器
- Lambda通过VPC连接到EC2,调用EC2上的API或脚本获取文件
- 这种方式适合必须保留原有挂载逻辑的场景,但需要额外维护EC2实例。
内容的提问来源于stack exchange,提问作者jay164843
相关产品推荐
相关产品推荐

