感谢http://www.crifan.com/csharp_integrate_dll_library_into_exe_application/
和 http://www.cnblogs.com/kui2/archive/2012/11/29/embedded-dll.html
对于vs2008 使用.net3.5的情况,可以直接在项目上添加现用项,Main函数最前添加以下函数
//格式1
//!!! for load embedded dll: (2) implement this handler
System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", "");
dllName = dllName.Replace(".", "_");
if (dllName.EndsWith("_resources")) return null;
System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());
byte[] bytes = (byte[])rm.GetObject(dllName);
return System.Reflection.Assembly.Load(bytes);
}
//格式2
// 框架加载dll失败后执行,手动加载dll
AppDomain.CurrentDomain.AssemblyResolve += (sender, senderArgs) =>
{
// 当前程序集
var executingAssembly = Assembly.GetExecutingAssembly();
// 当前程序集名称
var assemblyName = new AssemblyName(executingAssembly.FullName).Name;
// dll名称
var dllName = new AssemblyName(senderArgs.Name).Name;
// 待加载dll路径,指向当前程序集资源文件中dll路径。* 根据程序结构调整,使其正确指向dll
var dllUri = assemblyName + "." + dllName + ".dll";
// 加载dll
using (var resourceStream = executingAssembly.GetManifestResourceStream(dllUri))
{
var assemblyData = new Byte[resourceStream.Length];
resourceStream.Read(assemblyData, 0, assemblyData.Length);
//return Assembly.Load(assemblyData); //加载dll
var valrt = Assembly.Load(assemblyData); //加载dll
return valrt;
}
};
另外可以把dll都放到一个文件夹里,然后添加引用,并设置属性为"嵌入的资源"
改好的代码备份一下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Reflection;
namespace TestSystem
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
if (!ImportDLL())
{
MessageBox.Show("DLL import error!");
return;
}
//也可以直接在这里这样写
// AppDomain.CurrentDomain.AssemblyResolve += (sender, senderargs) =>
// {
// var executingAssembly = Assembly.GetExecutingAssembly();
// var assemblyName = new AssemblyName(executingAssembly.FullName).Name;
// var dllName = new AssemblyName(senderargs.Name).Name;
// var dllUri = assemblyName + ".reference." + dllName + ".dll";
// // var dllUri = assemblyName + "." + dllName + ".dll";
// using (var resourceStream = executingAssembly.GetManifestResourceStream(dllUri))
// {
// var assemblyData = new Byte[resourceStream.Length];
// resourceStream.Read(assemblyData, 0, assemblyData.Length);
// return Assembly.Load(assemblyData); //加载dll
// }
// };
//这种方法测试一直没成功,没找到原因 还不是很懂
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Application.Run(new TestSystemForm());
Application.Run(new MFrom());
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", "");
dllName = dllName.Replace(".", "_");
if (dllName.EndsWith("_resources")) return null;
object localobj=new object();
System.Resources.ResourceManager rm = new System.Resources.ResourceManager(localobj.GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());
byte[] bytes = (byte[])rm.GetObject(dllName);
return System.Reflection.Assembly.Load(bytes);
}
static bool ImportDLL()
{
try
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, senderargs) =>
{
var executingAssembly = Assembly.GetExecutingAssembly();
var assemblyName = new AssemblyName(executingAssembly.FullName).Name;
var dllName = new AssemblyName(senderargs.Name).Name;
var dllUri = assemblyName + ".reference." + dllName + ".dll";
// var dllUri = assemblyName + "." + dllName + ".dll";
using (var resourceStream = executingAssembly.GetManifestResourceStream(dllUri))
{
var assemblyData = new Byte[resourceStream.Length];
resourceStream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData); //加载dll
}
};
return true;
}
catch (System.Exception e)
{
return false;
}
}
}
}