我有一个项目使用Sqlite(System.Data.SQLite.DLL
)它是混合程序集。我需要在运行时加载它。据我所知,使用AssemblyResolve
事件是不可能的。因此目标是将程序集解压缩到Temp目录并向应用程序显示在哪里找到它。
代码是:
public static void SaveSqlite()
{
byte[] sqliteAsm = EmbedAssembly.System_Data_SQLite;
string tempFile = Path.GetTempPath();
File.WriteAllBytes(tempFile + "System.Data.SQLite.DLL", sqliteAsm);
}
// and the setup int start method
SaveSqlite();
AppDomain.CurrentDomain.SetupInformation.PrivateBinPath = Path.GetTempPath();
所以它不起作用。应用程序无法找到sqlite程序集,但它已成功保存到Temp目录。如何解决这个问题呢?感谢。
答案 0 :(得分:0)
解决方案已经成立。
不使用混合程序集但是为sqlite interop管理使用 SQLite的。
SQLite.Interop.dll - 本机dll(解压缩到任何目录)
调用SetDllDirectory
WinAPI设置dll搜索目录
从资源中提取sqlite本机dll的代码如下:
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string lpPathName);
//...
string text4 = Path.Combine(text, "SQLite.Interop.dll");
if (!File.Exists(text4))
{
byte[] array3 = LoadCompressedDllFromResource("nativedll.SQLite.Interop.z");
array3 = DecompressBytes(array3);
SaveToFile(array3, text4);
}
//...
使用 libz 应用程序
打包所有托管程序集