Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时加载混合程序集_C#_.net_Sqlite - Fatal编程技术网

C# 在运行时加载混合程序集

C# 在运行时加载混合程序集,c#,.net,sqlite,C#,.net,Sqlite,我有一个项目使用Sqlite(System.Data.Sqlite.DLL)它是混合汇编。我需要在运行时加载它。正如我所知,使用AssemblyResolve事件是不可能的。所以目标是将程序集解包到Temp目录,并向应用程序显示在哪里可以找到它。 代码是: public static void SaveSqlite() { byte[] sqliteAsm = EmbedAssembly.System_Data_SQLite; string tempFile = Path.Get

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

解决方案已经建立

  • 不使用混合程序集,但使用 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应用程序打包所有托管程序集

    什么不起作用?是否存在异常?专用bin路径必须位于应用程序的基本目录下,否则将忽略它。此外,在创建应用程序域后,您不能修改
    AppDomainSetup
    数据。仅在创建新应用程序域时读取数据。如果在创建后对其进行修改,则忽略这些更改。是。应用程序表示找不到assembly System.Data.SQLite.DLLmike z。好啊但是否有可能通过某种方式从临时加载组件?