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

C# 如何在导入或嵌入的资源DLL中声明类型,c#,reflection,dll,embed,dllimport,C#,Reflection,Dll,Embed,Dllimport,我实际上是在寻找将所有DLL和EXE合并到单个文件中的解决方案 我在这里问了一个问题: 我收到的建议是,我可以将DLL链接为嵌入资源,然后将嵌入DLL文件写入内存,并使用DLLImport导入DLL 我按照这里的指示: 下面是我所做的: [DllImport("System.Data.SQLite.dll")] public static SQLiteConnection sqLiteConnection1 = new SQLiteConnection(); public Form1()

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

我在这里问了一个问题:

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

我按照这里的指示:

下面是我所做的:

[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”对此声明类型无效。它仅对“方法”声明有效

如何在该DLL中声明类型


非常感谢。

DllImport属性用于从非托管DLL声明方法

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

using System.Data;
...

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

希望对您有所帮助。

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


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

dlliport
仅适用于本机DLL

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

  • 使用(免费)
    如何看和

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

  • (免费但最少的源代码更改)
    将所有需要的依赖项标记为“嵌入式资源”-这样它们就包含在EXE文件中。。。您需要设置一个处理程序,该处理程序在运行时读取资源并将所需的DLL返回到.NET运行时
在使用此类程序集中的类型时,请参见以下链接(它们包括参考资料和一些示例代码等):

  • (从字节数组加载程序集,因此无需将该程序集写入文件系统)

DllImport仅适用于非托管代码,此处还需要一个extern关键字。由于您的程序此处仅使用托管代码,因此您关注的博客针对的是另一个问题