在运行时加载混合程序集

本文关键字:程序集 混合 加载 运行时 | 更新日期: 2023-09-27 18:13:43

我有一个项目使用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目录。如何解决这个问题?谢谢。

在运行时加载混合程序集

解决方案已经成立。

  1. 不使用混合汇编,但管理sqlite互操作使用SQLite。

  2. SQLite.Interop.dll -本机dll(解压到任何目录)

  3. 调用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 application

打包所有托管程序集