我试图检测系统中是否安装了SQL Server Compact Edition

时间:2019-05-07 15:06:22

标签: c# wpf sql-server-ce

在控制台应用程序和WPF应用程序中,相同代码的行为有所不同。

当我在WPF应用程序中调用该方法时,即使未安装SQL Server CE,它也会返回true。但是,在控制台应用程序中运行的相同代码将返回false。

我找到了一种方法,但是似乎有两个行为是相同的,一个在控制台应用程序中,另一个在WPF应用程序中!有什么不同?

我已经记录了每个步骤,很震惊地看到它如何在WPF中返回true

public static bool IsSQLCeV40Installed()
{
        var result = false;

        try
        {
            System.Reflection.Assembly.Load("System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91");
            result = true;
            _logger.Info($"IsSQLCeV40Installed: IsSqlCe {result}");
        }
        catch (System.IO.FileNotFoundException)
        {
            _logger.Info("IsSQLCeV40Installed: File Not Found Exception");
        }
        catch (Exception)
        {
            _logger.Info("IsSQLCeV40Installed: General Exception");
        }

        return result;
}

WPF打印以下内容:

IsSQLCeV40Installed: IsSqlCe & returns true

控制台应用程序记录以下内容:

IsSQLCeV40Installed: File Not Found Exception & returns false

但是,如果计算机上未安装SQL Server CE,两者都应作为控制台应用程序返回!

2 个答案:

答案 0 :(得分:1)

其中一个应用程序最有可能是为x86和另一个AnyCPU或x64构建的,因此它们可以使用32位.NET Framework GAC或64位.NET Framework GAC。

此处提供更多提示:http://erikej.blogspot.com/2010/05/how-to-detect-if-x64-sql-compact-35-sp2.html

答案 1 :(得分:0)

如果您的应用程序依赖那里的sql ce和特定版本,则只需将dll复制到与exe相同的位置即可,则无需安装它们。因此,无需检查它们是否已安装。

使用您用于应用程序的任何安装程序或分发方法来执行此操作。这只是一个文件副本/ xcopy,而不是安装文件,当然可以从Windows服务器推送文件副本安装。

如果您有许多使用sql ce的应用程序,那么这当然会浪费客户端计算机上的磁盘空间。通常这不是问题。我认为是在5兆以下。

通常,我也建议您尝试避免通过错误处理来驱动程序逻辑。在可能会避免尝试捕捉驱动程序常规逻辑的地方,然后这样做。在这种情况下,您可以检查用户注册表中是否存在几个可能的条目之一。