C# 如何在导入或嵌入的资源DLL中声明类型
我实际上是在寻找将所有DLL和EXE合并到单个文件中的解决方案 我在这里问了一个问题: 我收到的建议是,我可以将DLL链接为嵌入资源,然后将嵌入DLL文件写入内存,并使用DLLImport导入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()
[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关键字。由于您的程序此处仅使用托管代码,因此您关注的博客针对的是另一个问题