2012-10-25 26 views
1

我已经对这个问题做了一些研究,并已经看到了一些可能的解决方案,但没有为我工作。SQLite DLL无法从WPF应用程序加载

无法加载文件或程序集“System.Data.SQLite.dll”或其某个 依赖项。指定的模块无法找到。

我有一个使用SQLite的WPF应用程序。在我的开发机器上(Windows 7,64位,Visual Studio 2010),一切正常。在QA部门,一切正常。但是在构建机器(Windows Server 2008,64位)和客户服务(32位)中,它会给出错误。

我的.sln包含3个项目 - 两个.exe和一个lib(由两个.exe项目使用并包含SQLite逻辑)。所有3个都有2个配置,Debug和Release,每个版本编译为x86。 SQLite dll在执行目录中。

我在我的GAC中有3个System.Data.SQLite条目,我已经验证了为什么我在我的计算机上取得了成功,但并不确定其他人,并非我知道为什么它不会使用找到的dll在执行目录中。所有GAC条目都是版本1.0.66.0,具有相同的公钥令牌,并分别与MSIL,x86和AMD64相关联。从GAC删除文件允许我重现错误,直到我将项目引用更改为“复制本地”,此时它再次在我的计算机上工作(并且仍然不在其他计算机上)。

不知道这是多么聪明,但我决定尝试动态加载dll(同时仍在我的项目中使用引用),检查我是在32位还是在64位环境中运行,并使用Assembly.LoadFrom加载SQLite DLL的正确位。该代码成功执行并在我的64位机器上运行32位版本,我认为这是因为x86编译平台。无论如何,它并没有改变我在其他机器上看到的错误。

关于如何解决此问题的建议?

编辑:反映结果从GAC

+2

你有没有试过用[DependencyWalker](http://www.dependencywalker.com/)这样的东西来判断缺失的东西? – climbage

+0

耶依赖沃克和融合查看器将是很好的调试。 – AbdElRaheim

+0

我偶尔使用过Dependency Walker,但还不足以说我对我的技能很满意。我在Dependency Walker中加载了我的.exe文件(在此之后,执行大部分SQLite工作的dll - 具有相同的结果),唯一显示在它下面的是MSCOREE.DLL。当然,我误解了我应该在这里看到的内容,但是我不应该看到我的文件依赖的.dll文件吗?如果没有对SQLite dll的引用,我甚至无法编译。 – REW

回答

1

去除引用后,我在过去有同样的问题。我构建到版本:一个引用System.Data.SQLite x32和其他x64。

+0

我希望它不会出现这种情况......但目前我没有看到任何好的选择。 – REW

+0

好吧,我承认,这是我在 - 双重构建。之前我没有真正做过这样的双重构建。我错误地认为这很容易:)无论如何,如果我构建为64位,我需要添加64位SQLite引用,并且它与32位很好地存在,只是用一个不同的名称。抛开代码的成功执行(因为这似乎并不奏效),当我转换到32位时,出现各种错误,说SQLiteConnection在两个引用(duh)中都存在。我不需要有2个.csproj文件,是吗? – REW

+0

为了记录,我对创建事件很有创意,以便将正确版本的SQLite dll移到正确的位置。 – REW