SQL Server Compact 错误:无法加载 DLL 'sqlceme35.dll'。指定的模块无法找到
Posted
技术标签:
【中文标题】SQL Server Compact 错误:无法加载 DLL \'sqlceme35.dll\'。指定的模块无法找到【英文标题】:SQL Server Compact error: Unable to load DLL 'sqlceme35.dll'. The specified module could not be foundSQL Server Compact 错误:无法加载 DLL 'sqlceme35.dll'。指定的模块无法找到 【发布时间】:2010-02-14 22:06:52 【问题描述】:我正在使用 Visual Studio 2008 C# 开发一个 Windows Forms 应用程序,该应用程序在客户端上使用 SQL Server Compact 3.5 数据库。客户端很可能是 32 位 Windows XP 或 Windows Vista 机器。我正在使用一个标准的 Windows Installer 项目,该项目创建一个 MSI 文件和 setup.exe 以在客户端计算机上安装应用程序。我是 SQL Server Compact 的新手,所以我以前不必分发这样的客户端数据库。当我运行 setup.exe(在带有 SP2 和 Internet Explorer 7 的新 Windows XP 32 位上)时,它安装得很好,但是当我运行应用程序时,我收到了这个错误:
无法加载 DLL 'sqlceme35.dll'。找不到指定的模块
我已经花了几个小时来寻找这个错误,但我能找到的只是与在 64 位 Windows 上安装相关的问题,而没有与我正在使用的普通 32 位相关的问题。
安装应用程序将它找到的所有依赖文件复制到指定的安装目录中,包括System.Data.SqlServerCe.dll
文件(程序集版本 3.5.1.0)。数据库文件位于应用程序目录之外的一个名为“data”的目录中,它的连接字符串是
<add name="Tickets.ieOutlet.Properties.Settings.TicketsLocalConnectionString" connectionString="Data Source=|DataDirectory|\data\TicketsLocal.sdf" providerName="Microsoft.SqlServerCe.Client.3.5" />
我的一些问题:
如果DLL文件在同一个目录,即应用程序本地,应用程序应该能够找到它,还是我需要将它安装在GAC中? (如果是这样,我可以使用 Windows Installer 在 GAC 中安装 DLL 文件吗?) 为了使用 SQL Server Compact 数据库,我还需要与应用程序一起分发其他任何内容吗? 还有其他 DLL 文件,例如用于在客户端将数据导出到 Excel 的 MS interop。这些是否需要安装在 GAC 中,或者将它们定位在应用程序目录中就足够了?【问题讨论】:
【参考方案1】:您不需要它在 GAC 中即可运行 SQL Server Compact,它会从应用程序目录中提取它们。部署 SQL Server Compact 项目的方法有多种。主要有两种方式:
将 SQL Server Compact 可再发行安装程序与您的项目一起部署,但这种方式很痛苦,并且最终用户可能会取消安装,或者通过 Windows 更新升级并破坏您的应用程序。
在您的应用程序文件夹中包含 DLL 文件。根据您使用的 SQL Server Compact 的功能(复制或其他),在您的应用程序文件夹中部署了一些 DLL 文件。
如果您的计算机上安装了 SQL Server Compact,它们很可能位于“C:\Program Files\Microsoft SQL Server Compact Edition\v3.5”。可以将它们添加到 Visual Studio 中的项目中,然后将它们的项目输出类型设置为“始终复制”。您在项目引用中对 System.Data.SqlServerCe
的主要引用应该将 copy local 设置为 true。
如果您已完成所有设置,那么在您的安装程序项目中,您只需包含该项目的项目输出,您就可以了。在我看来,这是唯一的出路。这是一个简单的部署,包含几个文件,您可以控制应用程序使用的 DLL 版本。
希望对你有帮助。
【讨论】:
您好,谢谢。在上面的第一个回复之后,我花了几天时间查看 ClickOnce,但我现在回到 MSI 解决方案,因为 ClickOnce 在使用应用程序分发紧凑型数据库时效果不佳。我没有解决我遇到的原始问题,但我会尝试包含 .dll。我第一次确实在app目录中有sqlceme35.dll,但我仍然收到错误,所以不确定错误是否仍然存在。 是的,希望它有效。我们通过单击一次部署了一个企业级智能客户端应用程序,并带有一个具有数千个最终用户的嵌入式 sql 紧凑型数据库,到目前为止,就应用程序的轻松部署和自动更新而言,该解决方案似乎最适合我们。 实际上它只是响了一声(或者我应该说它一旦你说它就点击了......哦),我没有意识到你通过点击一次进行部署。如果您单击发布选项卡/应用程序文件然后包含将正确部署的 sql dll,请检查您的单击项目设置,您可能需要检查全部显示才能看到它们。 在最初的 MSI 尝试之后,我切换到 ClickOnce。我遇到的问题是当应用程序的新版本可用并被下载时,整个应用程序被设置在一个新的目录结构中。这意味着我在原始应用程序文件夹中拥有的 SQL 紧凑型数据库对新应用程序不可见。我本可以将数据库复制到不同的文件夹,并在每次应用程序运行时检查它是否存在,如果不复制它等等,但它看起来很笨重。您将本地数据库放在应用程序的什么位置...您将其存储在 LocalApplicationData 还是其他地方?干杯,C 我们选择了 Application.UserAppDataPath ,每个版本实际上都不同,除了它从以前的版本复制内容以允许单击一次回滚。如果您没有设置所需的最低版本,用户可以通过添加删除程序回滚并访问旧版本/数据库。如果您不希望数据库建立并被复制到新目录,但希望目录在各个版本之间相同,则单击一次的另一个好选择是 Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "YourCompany ");【参考方案2】:我遇到了类似的问题,一个针对 32 位 Windows XP 和 Windows Vista 的 Visual Studio 2008 Windows 应用程序使用 SQL Server Compact 3.5 SP1 - 然后在 64 位 Windows 7 上安装时出现此错误:
无法加载 DLL 'sqlceme35.dll'。找不到指定的模块
我将 SQL Server Compact 的 MSI 嵌入到应用程序的安装程序中。
在看到这个相当困惑的discussion on MSDN 之后,我发现我需要在 64 位机器上为 SQL Server Compact 使用 64 位 MSI。哦!也就是说,从页面 Microsoft SQL Server Compact 3.5 Service Pack 1 and Synchronization Services for ADO.NET version 1.0 Service Pack 1 for Windows Desktop 开始,对于 64 位机器,我需要 SSCERuntime-ENU-x64.msi
而不是 SSCERuntime-ENU-x86.msi
。
【讨论】:
【参考方案3】:How to: Deploy a SQL Server Compact Edition Database with an Application 应该会有所帮助,至少在您的前两个问题上。
一般来说,我认为您不应该在 GAC 中为单个应用程序安装任何东西。
【讨论】:
【参考方案4】:以下提供了问题的解决方案和解释。
Troubleshooting: Can’t load SQL Server Compact DLL
SqlCeException on application's first use of SQL Server Compact
Laxmi Narsimha Rao Oruganti 's blog
我希望这会有所帮助。
【讨论】:
以上是关于SQL Server Compact 错误:无法加载 DLL 'sqlceme35.dll'。指定的模块无法找到的主要内容,如果未能解决你的问题,请参考以下文章
从 SQL Server Compact 4.0 迁移到 SQL Server Express 后提供程序错误
使用 C# 应用程序部署 SQL Server Compact
如何在 SQL Server Compact Edition 中重命名表?