Доступ к базе данных SQLite из шаблона tt в SharpDevelop

Я хотел бы разработать шаблон .tt для создания POCO из базы данных SQLite.

Я использую 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();
}
#>

Я добавил пакет NuGet System.Data.SQLite.1.0.92.0 в свой проект, чтобы 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()

Извините за сообщение на французском... "Le module spécifié est introuvable" означает "Указанный модуль не найден"...

Похоже, SharpDevelop удалось найти файл System.Data.SQLite.dll из моего проекта, но не удалось найти его собственный аналог SQLite.Interop.dll...

Как заставить SharpDevelop найти DLL???

Есть предположения?

Как только я выясню, как заставить SharpDevelop найти DLL и подключиться к моей базе данных, остальная часть шаблона должна быть довольно простой для реализации...

Спасибо за помощь!

Гис


person ghigad    schedule 18.04.2014    source источник


Ответы (2)


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. Поэтому вместо обходного пути/хака было бы сделать SQLite.Interop.dll доступным для SharpDevelop, поместив его на путь. Самый простой способ — скопировать его в папку bin SharpDevelop:

C:\Program Files (x86)\SharpDevelop\4.4\bin
person Matt Ward    schedule 18.04.2014

Благодаря вкладу @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 используется для поиска файла...

Идея Мэтта поместить dll в каталог bin SharpDevelop сработала бы, но мне не нравится идея сохранения файлов в каталоге приложения... Это означало бы, что мне придется копировать файлы снова, если я когда-нибудь обновите SharpDevelop до более новой версии...

Из журнала я предполагаю, что копирование dll из .../packages/content/net40/x86 в .../packages/lib/net40/x86 также помогло бы... То же самое здесь... Если бы я обманывать структуру каталогов пакетов SQLite Nuget, каждый раз, когда я буду проверять свой код из системы управления версиями или обновляться до более новой версии, мне придется снова копировать файл...

В конце концов я решил скопировать DLL в каталог C:\Program File (x86) и добавил его в свой PATH.

Прекрасно работает!

Спасибо, Мэтт, за то, что поставил меня на правильный путь!

person ghigad    schedule 18.04.2014