Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 某些客户端无法加载SQLite.Interop.dll_C#_Sqlite - Fatal编程技术网

C# 某些客户端无法加载SQLite.Interop.dll

C# 某些客户端无法加载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。链接到静态添加的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++可再发行版本。但后来我发现安装了Redisbusible


下一个假设是系统可以找到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(),但它不起作用。我用它工作。