我正在尝试在 IIS 中使用 EFCore 3.1.16 解决 ASP.Net Framework 4.8 站点的问题。Microsoft.Data.SqlClient 在 SNI.dll 上有一个进程锁定,这会导致 IIS 中的 xcopy 部署出现问题。
我尝试了将 SNI.dll 复制到与 Microsoft.Data.SqlClient 相同的卷影副本位置的策略,因此它不必尝试访问 bin 文件夹中的 DLL,如https://github.com/中所述lscorcia/sqlclient.snishadowcopy。
// Look for the main Microsoft.Data.SqlClient assembly in the
// shadow copy path
var sqlClientShadowAssembly = Directory.GetFiles(
currentShadowPath, "Microsoft.Data.SqlClient.dll",
SearchOption.AllDirectories).FirstOrDefault();
// Extract the directory information from the shadow assembly path
var sqlClientShadowPath =
Path.GetDirectoryName(sqlClientShadowAssembly);
// Find out the process bitness and choose the appropriate native
// assembly
var moduleName = Environment.Is64BitProcess ? "x86\\SNI.dll"
: "x64\\SNI.dll";
// Compute the source and target paths for the native assembly
var sourceFile = Path.Combine(currentPrivatePath, moduleName);
var targetFile = Path.Combine(sqlClientShadowPath, "SNI.dll");
File.Copy(sourceFile, targetFile);
但是,它仍然会首先尝试访问 bin 位置,而不是位于同一文件夹位置的 sni.dll。
我已经通过删除 DLL 并确认抛出 FileNotFound 异常来检查影子位置中的 Microsoft.Data.SqlClient 是否被正确使用。我还尝试直接复制到同一个文件夹中,并复制到其中的 x64 子文件夹中阴影位置。