无法找到 PInvoke DLL“sqlceme35.dll”
原文:Can’t find P/Invoke DLL sqlcemeNN.dll
作者:Laxmi Narsimha Rao ORUGANTI
翻译:flyjimi
我知道这是一个烦人的、信息不足、不具指导性、……的错误。原谅我这么迟才blog这个错误。迟做比不做好,下面就是了。
目前的错误是什么?
1) Can't find P/Invoke DLL sqlceme30.dll
2) Can't find P/Invoke DLL sqlceme35.dll
3) Can't find P/Invoke DLL sqlceme40.dll
这个错误到底什么意思?
当一个托管组件(这里是System.Data.SqlServerCe.dll)试图调用一个原生DLL(这里是sqlcemeNN.dll,NN代表产品的版本号30,35,等),系统没有找到那个要装载并调用其方法的DLL。
何时我们会碰到这个错误?
当系统在系统目录或当前进程的执行目录找不到需要的DLL时,就会出现这个错误。
如何处理这个错误?可能的修复方法是什么?
有多种情况,下面是最常见的:
1) 在.NET CF SP2之前,在存储卡上没有GAC的概念。如果你在存储卡上安装了SQL CE,在设备上安装了.NET CF 2.0 RTM/SP1,结果原生DLL就在存储卡上,而GAC在主存。因此,托管组件调用方法就会失败。
a. 请使用.NET CF SP2以上版本。
b. 请在主存储器安装cab文件。
c. 请更新到SQL CE 3.0 SP2/3.1或以上。
2) 你在开发智能设备(基于Windows CE操作系统)上的应用程序,并且使用了Visual Studio自动部署(F5)特性。VS在把System.Data.SqlServerCe.dll 映射到CAB文件时失败,只部署了System.Data.SqlServerCe.dll(注意:不会报错)。在这种情况下,原生DLL没有部署。
a. 取消自动部署。 (别问我怎么做)
b. 从项目中移除,然后重新添加 System.Data.SqlServerCe 的引用。 因为, VS 在项目文件保存了组件id. 而我们改变了SQL CE 3.5 SP1中的组件版本,移除再添加就会更新解决方案,引用正确的组件版本。
c. 手动拷贝安装SQL CE 的所有3个CAB文件,它们在以下目录:
%VisualStudioInstallRoot%/SmartDevices/SDK/SQL Server/Mobile/v3.5/ <platform>/ <processor>
或
%ProgramFiles%/Microsoft SQL Server Compact Edition/3.5/Devices/ <platform>/ <processor>
3) 系统加载sqlcemeNN.dll.失败。关于为什么系统加载模块失败的更多的细节,在我之前的一个blog(译注:中文翻译在这里)中有讨论。
4) 如果你的机器是64位的,你可能陷入了默认的目标平台“任何CPU”的陷阱,请设置目标平台为“x86”。如需要更多详情,请访问ErikEJ的博客。
5) 对于所有其他的情况,请升级到SQL CE 3.0 SP2/3.1 以上。如果可能,确保HKLM/Software/Microsoft/Microsoft SQL Server Compact Edition/<Version>/NativeDir 注册表指向原生DLL的安装目录。如果运行在WoW模式,请考虑WoW注册表。
致谢,
Laxmi Narsimha Rao ORUGANTI
[更新: 编辑目前的错误一节,吸引搜索引擎Live/Google]
[更新: 增加64位机器的情况,以及参考ErikEJ的博客]
发布日期:2007年10月26日 下午9:01,星期五 ,SQLCEBLOG
归档: Troubleshooting