如何在导入的或嵌入的资源DLL中声明类型



我实际上正在寻找将所有DLL和EXE合并到一个文件中的解决方案。

我在这里问了一个问题:

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

我收到了一个建议,我可以将DLL链接为嵌入资源,然后将嵌入DLL文件写入内存,并使用DLLImport导入DLL。

我按照这里的说明:

http://weblogs.asp.net/ralfw/archive/2007/02/04/single-assembly-deployment-of-managed-and-unmanaged-code.aspx

下面是我所做的:

[DllImport("System.Data.SQLite.dll")]
public static SQLiteConnection sqLiteConnection1 = new SQLiteConnection();
public Form1()
{
    ResourceExtractor.ExtractResourceToFile("MyApp.System.Data.SQLite.dll", "System.Data.SQLite.dll");
}
public static class ResourceExtractor
{
    public static void ExtractResourceToFile(string resourceName, string filename)
    {
        if (!System.IO.File.Exists(filename))
        using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
        using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
        {
            byte[] b = new byte[s.Length];
            s.Read(b, 0, b.Length);
            fs.Write(b, 0, b.Length);
        }
    }
}

但是Visual Studio说这个块会产生一个错误:

[DllImport("System.Data.SQLite.dll")]
public static SQLiteConnection sqLiteConnection1 = new SQLiteConnection();

错误1属性"DllImport"对此声明类型无效。它仅对"method"声明有效

如何声明DLL中的类型?

非常感谢。

DllImport属性用于声明非托管DLL中的方法。

由于System.Data.SQLite.dll是一个托管程序集,在将程序集保存到磁盘后,您需要做的是通过Reflection加载它,类似于:

using System.Data;
...
var assembly = Assembly.LoadFile(@"pathtoSystem.Data.SQLite.dll");
var type = assembly.GetType("System.Data.SQLite.SQLiteConnection");
IDbConnection connection = (IDbConnection)Activator.CreateInstance(type);

希望能有所帮助。

如果您想将托管程序集和exe放入一个文件中,我建议您查看ILMerge。

它比手动使用资源更容易使用。

DllImport仅适用于本机DLL。

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

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

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

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

在使用此类程序集的类型时,请参阅以下链接(包括参考资料和一些示例代码等):

  • 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

相关内容

  • 没有找到相关文章

最新更新