C# 某些客户端无法加载SQLite.Interop.dll
有一个应用程序使用SQLite。链接到静态添加的System.Data.SQLite和SQLite.Interop.dll(适用于x64和x86平台),版本1.0.112.0。(全部3个文件)(SQLite通过NuGet添加到测试项目中,并从那里复制到当前项目)。客户端计算机上存在System.Data.SQLite和SQLite.Interop.dll文件(在x86和x64文件夹中)。Net版本是4.7.2 大多数客户机工作正常,但少数客户机抛出异常,文本为“无法加载DLL‘SQLite.Interop.DLL’”。我在我的机器上为x86和x64生成测试版本,在每种情况下,SQLite.Interop.dll都是从相应的文件夹加载的(如果对应的路径上不存在SQLite.Interop.dll,则会出现异常) 在所有客户端计算机上,从何处避免此异常 有一种预感,客户端缺少Microsoft Visual C++可再发行版本。但后来我发现安装了RedisbusibleC# 某些客户端无法加载SQLite.Interop.dll,c#,sqlite,C#,Sqlite,有一个应用程序使用SQLite。链接到静态添加的System.Data.SQLite和SQLite.Interop.dll(适用于x64和x86平台),版本1.0.112.0。(全部3个文件)(SQLite通过NuGet添加到测试项目中,并从那里复制到当前项目)。客户端计算机上存在System.Data.SQLite和SQLite.Interop.dll文件(在x86和x64文件夹中)。Net版本是4.7.2 大多数客户机工作正常,但少数客户机抛出异常,文本为“无法加载DLL‘SQLite.In
下一个假设是系统可以找到SQLite.Interop.dll,但在加载或初始化过程中会发生错误,包装器(system.Data.SQLite)会将此错误解释为DllNotFoundException。指向dll的路径可能太长
当指向dll的路径太长(超过255个字符)时,我们遇到了类似的问题。经过长时间搜索,找到了DllNotFoundException的原因。这是因为SQLite.Interop.dll依赖于msvcr120。(依赖性Walker被用来解决这个问题)。但是有一件小事,如果应用程序是针对x64平台的,那么这个文件应该在C:\Windows\System32文件夹中找到。但是如果平台是x86,那么文件应该位于路径C:\Windows\SysWOW64上。我看到msvcr120位于System32文件夹中,并确定该问题与msvcr120无关 最简单的解决方案是为x86平台构建应用程序,并将msvcr120放在exe文件旁边 我找到了解决这个问题的更好办法。msvcr120的相应版本位于x86或x64文件夹中的SQLite.Interop.dll旁边。在使用sqlite之前(例如,在应用程序构造函数或其重载的OnStartup()方法中),我们需要将文件夹添加到PATH环境变量中
var pathVar = Environment.GetEnvironmentVariable("PATH");
string customDllFolder;
if (Environment.Is64BitProcess)
{
customDllFolder = Path.Combine(Environment.CurrentDirectory, "x64");
}
else
{
customDllFolder = Path.Combine(Environment.CurrentDirectory, "x86");
}
pathVar = string.Concat(pathVar, ";", customDllFolder);
Environment.SetEnvironmentVariable("PATH", pathVar, EnvironmentVariableTarget.Process);
此解决方案更好,因为如果msvcr120不在用户机器上,我们将只使用它的本地副本。我们还可以为这两种平台(x86和x64)构建应用程序。这种方法也可用于其他非托管库。Dll靠近exe文件。如果路径太长,则无法启动应用程序。我还检查了客户端机器上的路径,它少于255个字符。但是您的想法非常好。您可以使用验证DLL是否确实从正确的位置加载,然后继续。使用依赖者Walk可能会有帮助。MVCR120是VisualC++中的VisualStudio 2013可重分发包的一部分。您应该将x64和x86版本的安装程序与应用程序安装程序捆绑在一起,以防止出现这种情况。@webmaster442,我正在使用它。我需要一种从自定义文件夹加载MSVCR120的方法,如果用户计算机上不存在。我尝试SetDllDirectory(),但它不起作用。我用它工作。