从SharpDevelop中的tt模板访问SQLite数据库

时间:2014-04-18 01:48:45

标签: sqlite code-generation sharpdevelop

我想开发一个.tt模板来从SQLite数据库生成POCO。

我使用SharpDevelop 4.4。

这是我到目前为止的.tt ...

<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Data.SQLite" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SQLite" #>
<#@ import namespace="System.IO" #>

<#
using (SQLiteConnection db = 
       new SQLiteConnection
            (string.Format("Data Source={0}", 
             Path.Combine(Path.GetDirectoryName(Host.TemplateFile), 
                          "Test.db"))))
{
    db.Open();
}
#>

我将 System.Data.SQLite.1.0.92.0 NuGet包添加到我的项目中,以便让SQLite正常工作。

当我运行模板时,我遇到以下错误:

Error running transform: System.DllNotFoundException: Unable to load DLL 'SQLite.Interop.dll': Le module spécifié est introuvable. (Exception from HRESULT: 0x8007007E)
   at System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(SQLiteConfigOpsEnum op)
   at System.Data.SQLite.SQLite3.StaticIsInitialized()
   at System.Data.SQLite.SQLiteLog.Initialize()
   at System.Data.SQLite.SQLiteConnection..ctor(String connectionString, Boolean parseViaFramework)
   at System.Data.SQLite.SQLiteConnection..ctor(String connectionString)
   at Microsoft.VisualStudio.TextTemplating.GeneratedTextTransformation5e95cd16.TransformText()
   at Mono.TextTemplating.CompiledTemplate.Process()

对不起法语留言...“Lemodulespécifiéestintrouvable”表示“无法找到指定的模块”...

看起来SharpDevelop设法从我的项目中找到 System.Data.SQLite.dll 文件,但未能找到它的本机对应 SQLite.Interop.dll ..

我怎样才能让SharpDevelop找到DLL ???

有什么想法吗?

一旦我弄清楚如何让SharpDevelop找到DLL并连接到我的数据库,模板的其余部分应该非常直接地实现...

感谢您的帮助!

Ghis

2 个答案:

答案 0 :(得分:1)

SharpDevelop将找到您的System.Data.SQLite.dll,因为您的项目将引用它。

我的第一个想法是:

对于SQLite.Interop.dll,您可以在项目中添加对它的引用,或者如果您不想这样做,则可以指定.dll的路径。您应该可以执行以下操作:

<#@ assembly name="$(SolutionDir)packages\System.Data.SQLite.Core.1.0.92.0\content\net45\x86\SQLite.Interop.dll" #>

不幸的是,由于SQLite.Interop.dll不是.NET程序集,因此不起作用。因此,解决方法/黑客将通过将SharpTvelop放在路径上来使SQLite.Interop.dll可用。最简单的方法是将其复制到SharpDevelop的bin文件夹中:

C:\Program Files (x86)\SharpDevelop\4.4\bin

答案 1 :(得分:1)

感谢@ matt-ward输入,我终于明白了!

我使用Process Monitor找出SharpDevelop在寻找DLL的位置..这就是我发现的......

C:\Users\ghigad\Projets\CS\TestT4\packages\System.Data.SQLite.Core.1.0.92.0\lib\net40\x86\SQLite.Interop.dll
C:\Users\ghigad\Projets\CS\TestT4\packages\System.Data.SQLite.Core.1.0.92.0\lib\net40\Win32\SQLite.Interop.dll
C:\Program Files (x86)\SharpDevelop\4.4\AddIns\Misc\TextTemplating\x86\SQLite.Interop.dll
C:\Program Files (x86)\SharpDevelop\4.4\AddIns\Misc\TextTemplating\Win32\SQLite.Interop.dll
C:\Program Files (x86)\SharpDevelop\4.4\ADDINS\MISC\TEXTTEMPLATING\SQLite.Interop.dll
C:\Program Files (x86)\SharpDevelop\4.4\AddIns\Misc\TextTemplating\x86\SQLite.Interop.dll
C:\Program Files (x86)\SharpDevelop\4.4\AddIns\Misc\TextTemplating\Win32\SQLite.Interop.dll
C:\Users\ghigad\Projets\CS\TestT4\packages\System.Data.SQLite.Core.1.0.92.0\lib\net40\x86\SQLite.Interop.dll
C:\Users\ghigad\Projets\CS\TestT4\packages\System.Data.SQLite.Core.1.0.92.0\lib\net40\Win32\SQLite.Interop.dll
C:\Program Files (x86)\SharpDevelop\4.4\AddIns\Misc\TextTemplating\x86\SQLite.Interop.dll
C:\Program Files (x86)\SharpDevelop\4.4\AddIns\Misc\TextTemplating\Win32\SQLite.Interop.dll
C:\Program Files (x86)\SharpDevelop\4.4\ADDINS\MISC\TEXTTEMPLATING\SQLite.Interop.dll
C:\Program Files (x86)\SharpDevelop\4.4\AddIns\Misc\TextTemplating\x86\SQLite.Interop.dll
C:\Program Files (x86)\SharpDevelop\4.4\AddIns\Misc\TextTemplating\Win32\SQLite.Interop.dll
C:\Users\ghigad\Projets\CS\TestT4\packages\System.Data.SQLite.Core.1.0.92.0\lib\net40\SQLite.Interop.dll
C:\Program Files (x86)\SharpDevelop\4.4\bin\SQLite.Interop.dll
C:\Windows\SYSWOW64\SQLite.Interop.dll
C:\Windows\system\SQLite.Interop.dll
C:\Windows\SQLite.Interop.dll
C:\Windows\SYSWOW64\SQLite.Interop.dll
C:\Program Files\Common Files\Microsoft Shared\Windows Live\SQLite.Interop.dll
C:\Program Files (x86)\COMMON FILES\MICROSOFT SHARED\Windows Live\SQLite.Interop.dll
C:\Program Files\Java\jdk1.6.0_30\bin\SQLite.Interop.dll
C:\Program Files\apache-ant-1.8.2\bin\SQLite.Interop.dll
C:\cygwin\bin\SQLite.Interop.dll
C:\Windows\SYSWOW64\SQLite.Interop.dll
C:\Windows\SQLite.Interop.dll
C:\Windows\SYSWOW64\wbem\SQLite.Interop.dll
C:\Windows\SYSWOW64\WindowsPowerShell\v1.0\SQLite.Interop.dll
C:\Program Files\Intel\WiFi\bin\SQLite.Interop.dll
C:\Program Files\Common Files\Intel\WirelessCommon\SQLite.Interop.dll
C:\Program Files (x86)\COMMON FILES\Roxio Shared\DLLShared\SQLite.Interop.dll
C:\Program Files (x86)\Common Files\Roxio Shared\OEM\DLLShared\SQLite.Interop.dll
C:\Program Files (x86)\Common Files\Roxio Shared\OEM\DLLShared\SQLite.Interop.dll
C:\Program Files (x86)\COMMON FILES\Roxio Shared\OEM\12.0\DLLShared\SQLite.Interop.dll
C:\Program Files (x86)\Roxio\OEM\AudioCore\SQLite.Interop.dll
C:\Program Files (x86)\MICROSOFT SQL SERVER\100\Tools\Binn\SQLite.Interop.dll
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLite.Interop.dll
C:\Program Files\Microsoft SQL Server\100\DTS\Binn\SQLite.Interop.dll
C:\Program Files (x86)\MICROSOFT SQL SERVER\100\Tools\Binn\VSShell\Common7\IDE\SQLite.Interop.dll
C:\Program Files (x86)\MICROSOFT SQL SERVER\100\DTS\Binn\SQLite.Interop.dll
C:\Program Files\TortoiseSVN\bin\SQLite.Interop.dll
C:\Program Files (x86)\QuickTime\QTSystem\SQLite.Interop.dll
C:\Program Files (x86)\Windows Live\Shared\SQLite.Interop.dll

因此,事实证明搜索了不少目录,然后我的PATH变量的内容用于搜索文件......

Matt关于将dll放在SharpDevelop的bin目录中的想法可行,但我不喜欢在应用程序目录中保存文件的想法......这意味着我必须重新复制文件如果我将SharpDevelop更新为更新的版本......

从日志中,我想将... / packages / content / net40 / x86中的dll复制到... / packages / lib / net40 / x86也可以完成这个诀窍......同样的事情......如果我愚弄SQLite的Nuget包目录结构,每次我都会从源代码控制中检查我的代码或升级到更新的版本,我将不得不再次复制该文件......

我最终决定将DLL复制到C:\ Program File(x86)目录中,并将其添加到我的PATH中。

效果很好!

谢谢Matt让我走上正轨!