我实际上正在寻找解决方案将所有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中声明类型?
非常感谢你。
答案 0 :(得分:2)
DllImport
属性用于从非托管DLL声明方法。
由于System.Data.SQLite.dll
是托管程序集,因此在将程序集保存到磁盘后,您需要执行的操作是通过Reflection
加载它,例如:
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);
希望有所帮助。
答案 1 :(得分:1)
如果您想将托管程序集和exe填充到一个文件中,建议您查看ILMerge。
使用它比使用资源手动操作要容易得多。
答案 2 :(得分:0)
DllImport
仅适用于本机DLL。
在嵌入托管DLL时,您有以下几种选择:
OR
OR
AssemblyResolve
处理程序,它在运行时从Resources读取并将所需的DLL返回给.NET运行时。 .. 使用此类程序集中的类型时,请参阅这些链接(它们包括参考资料和一些示例代码等):