在运行时加载混合程序集

时间:2014-07-21 07:43:14

标签: c# .net sqlite

我有一个项目使用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 个答案:

答案 0 :(得分:0)

解决方案已经成立。

  1. 不使用混合程序集但是为sqlite interop管理使用 SQLite的。

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

  3. 调用SetDllDirectory WinAPI设置dll搜索目录

  4. 从资源中提取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 应用程序

    打包所有托管程序集