Это можно сделать, используя встроенную фичу System.Data.SQLite, которая ищет версию SQLite.Interop.dll кроме как рядом с собой, ещё и в директории, соотв. архитектуре, т.е. x86 или x64 соответственно.
См.
Using Native Library Pre-Loading в
ихней wiki.
Делал так:
- Качал Precompiled Binaries для x86 и x64, которые не mixed-mode, а System.Data.SQLite.dll + SQLite.Interop.dll. В них System.Data.SQLite.dll совпадают.
- Клал всё это в директорию
cs/Common/SQLite/
так:
- System.Data.SQLite.dll
- System.Data.SQLite.pdb
- System.Data.SQLite.xml
- x86/
- SQLite.Interop.dll
- SQLite.Interop.pdb
- x64/
- SQLite.Interop.dll
- SQLite.Interop.pdb
- В проекте делал Private Reference (т.е. Copy Local = True) на System.Data.SQLite.dll, и линки с путями на Interop dll-ки. Линки в csproj выглядят так (кажется, руками правил чтоб пути были x86 и x64):
<Content Include="..\..\..\cs\Common\SQLite\x86\SQLite.Interop.dll">
<Link>x86\SQLite.Interop.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\..\..\cs\Common\SQLite\x86\SQLite.Interop.pdb">
<Link>x86\SQLite.Interop.pdb</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\..\..\cs\Common\SQLite\x64\SQLite.Interop.dll">
<Link>x64\SQLite.Interop.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\..\..\cs\Common\SQLite\x64\SQLite.Interop.pdb">
<Link>x64\SQLite.Interop.pdb</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
Всё, после сборки в Debug или Release получаются две директории x86 и x64 с соотв. SQLite.Interop.dll, System.Data.SQLite.dll и exe-шник проги, который работает в винде любой битности.
Там еще чуток посложнее было, потому как тот же проект у меня под Mono на Linux шёл, поэтому были еще ссылки на libsqlite3.so.0, но это уже другая история.