1

我们有一个 C# 应用程序正在使用 SQL CE 3.5 的情况。为了允许遗留程序使用它的一些特性,我们制作了一个 C++ dll,它使用互操作从 C# 程序中提取它需要的信息。为此,C# 程序需要访问数据库。它不是一个非常复杂的场景。

但是,在尝试使用私有安装进行部署时,会出现一些问题。 C#程序没有问题,它可以访问数据库并使用它没有任何问题。

但是,当尝试通过强制 C# 程序访问数据库的 C++ 互操作访问 C# 程序中的函数时,我们会遇到崩溃,异常说“......提供者:System.Data.SqlServerCe.3.5 是未安装”。

这显然是因为我们无法将 App.config 文件添加到正在执行的程序中。

我们怎样才能解决这个问题?还有其他方法可以解决这个问题吗?任何其他形式的 SQL CE 3.5 安装方法都是不可能的。所以我们必须让它发挥作用。

问候,

编辑:

我不是直接针对 SQL CE,而是通过 Linq2SQL。我试图将配置文件添加到我所有的 dll 中,它没有帮助。似乎只有可执行文件是否有 app.config 才重要。

抛出的异常说 - 未安装提供程序 System.Data.SqlServerCe.3.5。

根据堆栈跟踪要调用的最新函数是 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Initialize(...)。

编辑 2

我已经添加了部署工作所需的所有文件。正如我在上面所写的,如果我通过一个带有 app.config 文件的 .net 可执行文件使用程序 dll(它使用 Linq 2 Sql),它指定在哪里查找 SQL CE 3.5 dll。部署不能只使用文件,需要一个 app.config 文件。

问题是我们必须通过 C++ 可执行文件来使用 dll 文件,它无法告诉 .net 在哪里寻找 Sql Ce 3.5 dll。

4

5 回答 5

1

将以下文件添加到您的应用程序文件夹:

  • sqlceca35.dll
  • sqlcecompact35.dll
  • sqlceer35E.dll
  • sqlceme35.dll
  • sqlceoledb35.dll
  • sqlceqp35.dll
  • sqlcese35.dll
  • System.Data.SqlServerCe.dll

那么它将起作用。

如果您没有在目标机器上明确安装 sql server ce 3.5(我认为大多数部署都是这种情况),那么这是必要的。

于 2008-10-28T09:33:05.923 回答
0

您可以添加一个 foo.dll.config 文件并确保它与 DLL 一起存在。您只需要确保您的 DLL 中有代码以确定它在磁盘上的位置,并从同一位置读取配置。

祝你好运!

于 2008-10-27T22:38:54.963 回答
0

我还看到一个实例,其中 GAC 中的 System.Data.SqlServerCe.dll 是错误的文件版本,我从 cmd 命令提示符替换了 GAC 中的 dll。

关于文件必须在文件夹中的观点是正确的 - 除非 GAC 因拥有多个版本而感到困惑

于 2008-11-20T14:58:13.500 回答
0

这显然是因为我们无法将 App.config 文件添加到正在执行的程序中。

为什么不?好的,所以 Visual Studio 不会自动构建配置文件并将其重命名并将其移动到输出目录,但是您是否尝试过.exe.config在 C++ 应用程序旁边添加一个文件?

于 2008-11-06T15:44:18.023 回答
0

不要使用 LINQ,而是对从 C++ 程序调用的方法使用 SqlCeConnection、SqlCeCommand 等

于 2009-11-27T11:06:37.960 回答