如何使用Embed Resource的DLL加载?

时间:2012-02-10 13:20:30

标签: c# sqlite resources embed

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

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

using System.Data.SQLite;

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

,我想将 app.exe 和此DLL合并到一个文件中。 我尝试过使用 ILmerge ,但失败了。据我所知, ILmerge 无法合并unmanage DLL。

所以,我尝试了另一种方法>将DLL作为嵌入资源。 我可以使用以下代码将其作为程序集加载:

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指令或程序集引用?)

你能分享一下你的见解吗?感谢。

2 个答案:

答案 0 :(得分:5)

您可以同时嵌入程序集并引用它(在VS中)...对于您想要使用它的方式,您需要引用它!你没有参考大会的任何理由?

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

在嵌入托管DLL时,您有以下几种选择:

OR

  • 使用SmartAssembly(商业)之类的工具 它可以嵌入和合并其他东西(无需更改源代码)

OR

  • code that yourself in less than 10 lines(免费但最少的源代码更改)
    将所有需要的依赖项标记为“嵌入式资源” - 这样它们就包含在EXE文件中......您需要设置一个AssemblyResolve处理程序,它在运行时从Resources读取并将所需的DLL返回给.NET运行时。 ..

答案 1 :(得分:-1)

这不是使用AppDomain中加载的程序集的方法。 请阅读这篇文章:How to: Load Assemblies into an Application Domain

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