在C#中嵌入SQLite.Interop.dll。>

问题描述 投票:0回答:1

我有一个应用程序,该应用程序将其需要嵌入的所有DLL文件嵌入其中,因此它是一个独立的exe。这是我现在加载所有内容的方式:

    public static Assembly ExecutingAssembly = Assembly.GetExecutingAssembly();
    public static string[] EmbeddedLibraries = ExecutingAssembly.GetManifestResourceNames().Where(x => x.EndsWith(".dll")).ToArray();
    public static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
        // Get assembly name
        var assemblyName = new AssemblyName(args.Name).Name + ".dll";

        // Get resource name
        var resourceName = EmbeddedLibraries.FirstOrDefault(x => x.EndsWith(assemblyName));
        if (resourceName == null) {
            return null;
        }

        // Load assembly from resource
        using (var stream = ExecutingAssembly.GetManifestResourceStream(resourceName)) {
            var bytes = new byte[stream.Length];
            stream.Read(bytes, 0, bytes.Length);
            return Assembly.Load(bytes);
        }
    }
    public static void Main(string[] arg) {
        AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
        RealMain();
    }

因此,我注意到的第一个有趣的事情是,它仅加载第一页中使用的DLL文件。仅将using System.Data.SQLite;放在顶部以使其包含System.Data.SQLite.dll是不够的,您还必须立即进行一些与该名称空间相关的操作。

下一个问题涉及SQLite.Interop.dll,它将不会加载到程序集中。尝试时出现以下错误:

Exception thrown: 'System.BadImageFormatException' in mscorlib.dll
An unhandled exception of type 'System.BadImageFormatException' occurred in mscorlib.dll
The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018)

现在,我可以解压缩DLL并将其复制到c:\Windows\System32目录,但是由于其他所有内容都是自包含的,因此也可以。我注意到这个SDK声称能够将其创建为虚拟文件:

https://www.boxedapp.com/boxedappsdk/usecases/embed_system.data.sqlite.dll_dependencies.html

没有额外的SDK,有没有办法做到这一点?或者作为替代方案,是否存在另一种方法来创建和使用SQLite数据库,而无需使用其他程序包使用该DLL?昨天我尝试了3-4个不同的程序包,但结果却一无所获。

我有一个应用程序,该应用程序将其需要嵌入的所有DLL文件嵌入其中,因此它是一个独立的exe。这是我现在加载所有内容的方式:public static Assembly ExecutingAssembly = ...

c# sqlite embedded-resource
1个回答
0
投票

解决方案

© www.soinside.com 2019 - 2024. All rights reserved.