在控制台应用程序和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,两者都应作为控制台应用程序返回!
答案 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兆以下。
通常,我也建议您尝试避免通过错误处理来驱动程序逻辑。在可能会避免尝试捕捉驱动程序常规逻辑的地方,然后这样做。在这种情况下,您可以检查用户注册表中是否存在几个可能的条目之一。