SQLite - 如何摆脱讨厌的跟踪消息 - “本机库预加载器无法获取设置...值”?

时间:2016-02-26 18:32:24

标签: c# sqlite sql-server-2008

我为SQL Server 2008开发了一些带UDF的C#程序集。 特别是我有一些使用SQLite数据库的函数。 我在那里添加了跟踪监听器来写一个日志文件,看看里面是什么东西。 但是有一个问题 - 在每次调用UDF函数时,它都会使用以下消息充斥日志文件:

20160226,191636.67 [P5816]/[T4]  Native library pre-loader failed to get setting "No_PreLoadSQLite" value: System.ArgumentNullException: Value cannot be null.
Parameter name: path1
   at System.IO.Path.Combine(String path1, String path2)
   at System.Data.SQLite.UnsafeNativeMethods.GetXmlConfigFileName()
   at System.Data.SQLite.UnsafeNativeMethods.GetSettingValue(String name, String default)

我可以看到,在每次调用时,它都记录了以下每个参数中的18条此类消息:

"No_PreLoadSQLite", "PreLoadSQLite_NoSearchForDirectory",  "PreLoadSQLite_ProcessorArchitecture",
"PreLoadSQLite_ProcessorArchitecture", "PreLoadSQLite_BaseDirectory",   "PreLoadSQLite_UseAssemblyDirectory",
"PreLoadSQLite_ProcessorArchitecture", "No_PreLoadSQLite", "PreLoadSQLite_NoSearchForDirectory",
"PreLoadSQLite_ProcessorArchitecture", "PreLoadSQLite_ProcessorArchitecture", "PreLoadSQLite_BaseDirectory",
"PreLoadSQLite_UseAssemblyDirectory", "PreLoadSQLite_ProcessorArchitecture", "No_SQLiteConnectionNewParser",
"DefaultFlags_SQLiteConnection", "No_SQLiteFunctions", "SQLite_ForceLogPrepare"

看到日志中的所有消息,很难跟踪与我感兴趣的功能相关的日志消息,这有点烦人。

您能否请一下建议 - 如何摆脱额外的 / 不需要的跟踪消息?

也许我需要做一些特殊的SQLlite API调用来禁用所有设置的加载?

注意:为了使我的UDF程序集在SQL Server CLR引擎下工作,我复制了 SQLite.Interop.dll System.Data.SQLite.dll System.Data.SQLite.dll.config 文件到C:\ Windows \ system32。 正如您所看到的, System.Data.SQLite.dll.config 文件与 System.Data.SQLite.dll 位于同一目录中,但它没有帮助。

注意:两个DLL SQLite.Interop.dll System.Data.SQLite.dll 都有1.0.99.0版本。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

我有同样的问题,虽然我使用Fody/Costura在我的程序集中嵌入了System.Data.SQLite库(如果你正在做类似的事情,它还不清楚)。

您显示的错误来自this code

private static string GetXmlConfigFileName()
{
    string directory;
    string fileName;

#if !PLATFORM_COMPACTFRAMEWORK
    directory = AppDomain.CurrentDomain.BaseDirectory;
    fileName = Path.Combine(directory, XmlConfigFileName);

    if (File.Exists(fileName))
        return fileName;
#endif

    directory = GetAssemblyDirectory();
    fileName = Path.Combine(directory, XmlConfigFileName);

    if (File.Exists(fileName))
        return fileName;

    return null;
}

方法GetAssemblyDirectory如果无法找出程序集的路径,则返回null,这会使Path.Combine抛出。在我的例子中,因为Costura从流加载它的程序集,所以它们没有目录,因此GetAssemblyDirectory失败。

好消息是我opened a ticket with System.Data.SQLite并且几乎立即修复了。希望很快就能推出。