前言
诚然,在之前的文章中也有写过将所有文件合入到一个exe文件中的方式,一种是通过打包,一种是通过资源文件【文末附带链接】,但是两个方法到最后运行的时候都是需要释放出来,所以相对来说还是不够友好;
现在,我们可以通过这篇文章用另一种方式来实现。
开发环境:.NET Framework版本:4.8
开发工具:Visual Studio 2022
实现步骤
以下测试我们要实现的是集成两个DLL,一个是自己的项目类库
ClassLibrary1
,另一个是使用第三方的Newtonsoft.Json.dll
。在主程序中新建一个Lib文件夹,将
Newtonsoft.Json.dll
放入进去并引用。在项目中新建一个类库
ClassLibrary
,并在其中随便实现一段代码方便调用
namespace ClassLibrary1
{
public class Common
{
public int Add(int a,int b)
{
return a+b;
}
}
}
将以上类库生成后,同时引入到主程序中,并将生成的
ClassLibrary1.dll
放入到Lib文件夹中,最后项目框架如下
在引用下的两个dll右键->属性->复制本地改为False,这样就在生成的时候不会出现在debug目录下了
在Lib目录下的两个dll右键->属性->生成操作选择为嵌入的资源
在
Program
文件中注册AssemblyResolve
事件,事件内的代码如下
private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string assemblyName = Assembly.GetExecutingAssembly().GetName().Name + ".Lib." + new AssemblyName(args.Name).Name + ".dll";
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(assemblyName))
{
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
return Assembly.Load(buffer);
}
}
以上,其实就完成了整个操作,但是由于
ClassLibrary1
项目是我们自己写的,随时会涉及到改动,每次都复制会比较麻烦,而且还有忘记的风险,所以,之前文章中写的生成事件就有用武之地了,我们在ClassLibrary1
的生成后事件中添加以下命令,这样每次生成后就会自动复制到Lib目录了
copy "$(TargetPath)" "$(SolutionDir)\$(SolutionName)\Lib"
最后在窗体中分别实现调用
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(""+new Common().Add(3, 4));
}
private void button2_Click(object sender, EventArgs e)
{
Dictionary<string,object> dic=new Dictionary<string, object>();
dic.Add("name", "张三");
dic.Add("age", 20);
string json = JsonConvert.SerializeObject(dic);
MessageBox.Show(json);
}
实现效果
☛☛☛点击此处下载源码☚☚☚
可参考文章