如何使用从嵌入资源加载的DLL

本文关键字:DLL 加载 嵌入资源 何使用 | 更新日期: 2023-09-27 18:23:57

我有一个DLL>>System.Data.SQLite.DLL

要以正常方式使用它>只需将其添加为参考和

using System.Data.SQLite;

然后,我可以使用这个DLL中的所有函数。

但是,我想将我的app.exe和这个DLL合并到一个文件中。我尝试过使用ILmerge,但失败了。正如我所知,ILmerge无法合并未管理的DLL。

因此,我尝试了另一种方法>将DLL作为embbed资源。我可以用以下代码将其加载为一个程序集:

Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyApp.System.Data.SQLite.dll");
byte[] ba = null;
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
    int read;
    while ((read = stm.Read(buffer, 0, buffer.Length)) > 0)  
    {
        ms.Write(buffer, 0, read);
    }
    ba = ms.ToArray();
}
Assembly sSQLiteDLL = Assembly.Load(ba);

但是,我将如何使用SQLiteDLL中的函数?

我还尝试将DLL添加为属性中的资源,并像这样加载:

public Form1()
{
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    InitializeComponent();
}
System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    AppDomain domain = (AppDomain)sender;
    if (args.Name.Contains("System_Data_SQLite"))
    {
        return domain.Load(MyApp.Properties.Resources.System_Data_SQLite);
    }
    return null;
}

上面解释了我到目前为止得到的东西,我不知道下一步该怎么做才能使用DLL?我仍然无法使用DLL中的函数。

例如,当我键入以下内容时:

SQLiteCommand cmd = new SQLiteCommand();

Visual Studio表示:

错误21找不到类型或命名空间名称"SQLiteCommand"(是否缺少using指令或程序集引用?)

你能分享你的见解吗?谢谢

如何使用从嵌入资源加载的DLL

您可以嵌入一个程序集并同时引用它(在VS中)。。。对于你想要使用它的方式,你需要参考它!你为什么不提到大会?

使用来自嵌入式程序集(托管)的类型而不引用它有点困难,但可以使用反射等-请参阅这些链接(它们包括参考资料和一些示例代码等):

  • http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx
  • https://stackoverflow.com/a/57450/847363
  • http://msdn.microsoft.com/en-us/library/h538bck7.aspx(从字节数组加载程序集,因此无需将该程序集写入文件系统)
  • http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettype.aspx
  • http://www.codeproject.com/Articles/32828/Using-Reflection-to-load-unreferenced-assemblies-a

在嵌入托管DLL时,您有几个选项:

  • 使用ILMerge(免费)
    了解如何查看此处和此处

  • 使用一些工具,如SmartAssembly(商用)
    它可以嵌入和合并其他内容(无需更改源代码)

  • 不到10行的代码(免费但最少的源代码更改)
    将所有需要的依赖项标记为"嵌入式资源"-这样它们就包含在EXE文件中。。。您需要设置一个AssemblyResolve处理程序,它在运行时从参考资料中读取并将所需的DLL返回到.NET运行时

这不是使用AppDomain中加载的程序集的方法。请阅读这篇文章:如何:将程序集加载到应用程序域

简而言之,您应该使用方法名(例如SqlCommand)调用GetMethod(),然后通过.Invoke()方法调用它。