我有一个应用程序,该应用程序将其需要嵌入的所有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 = ...