应用场景:当发布的程序有引用其它dll, 又只想发布一个exe时就需要把dll打包到exe;方法如下:1、项目右键选择“属性”;2、添加资源文件:在属性设置界面选择“资源”选项卡,点击“添加现有文件”,选择需嵌入的dll文件;添加资源后dll将拷贝到项目文件夹下的“Resources”子文件夹下;3、添加上一步添加的dll文件;4、Dll属性复制本地设置为False;5、在应用程序的主入口点添加一下代码:在C#编程中,有时我们需要将引用的DLL文件与主执行程序(EXE)整合在一起,以便在只发布单个可执行文件的情况下运行程序。这种技术通常用于减少部署的复杂性,防止因为丢失依赖库而导致的运行错误。下面将详细解释如何实现C#将引用的DLL嵌入到EXE文件中。1. **项目属性设置**:右键点击项目,在弹出的菜单中选择“属性”。进入项目属性页面,这是配置项目的关键步骤。2. **添加资源文件**:在属性设置界面,切换到“资源”选项卡。点击“添加现有文件”,然后选择需要嵌入的DLL文件。添加后,DLL会被复制到项目文件夹下的“Resources”子文件夹中。这个操作是将DLL纳入项目资源管理的一部分。3. **修改DLL属性**:对于添加的DLL文件,需要设置其属性。在解决方案资源管理器中找到该DLL,右键选择属性,将“复制本地”设置为“False”。这样可以避免在编译后自动复制DLL到输出目录,因为我们计划将DLL内嵌到EXE中。4. **代码实现**:需要在应用程序的主入口点添加代码来处理嵌入的DLL加载。创建一个静态类,例如`DllClass`,并在其中定义一个静态方法`LoadResourceDll`。在这个方法中,我们将处理程序在运行时动态加载嵌入的DLL。```csharpstatic class Program{[STAThread]static void Main(){// 其他初始化代码...DllClass.LoadResourceDll();// 继续程序启动...}}class DllClass{public static void LoadResourceDll(){AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);}private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args){// 从事件参数中获取DLL名称,并进行格式转换string dllName = ...;// 获取主程序的命名空间string Namespace = Assembly.GetEntryAssembly().GetTypes()[0].Namespace;// 使用ResourceManager从资源中获取DLL的字节流System.Resources.ResourceManager rm = new System.Resources.ResourceManager(Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());byte[] bytes = (byte[])rm.GetObject(dllName);// 加载字节流为Assembly对象return System.Reflection.Assembly.Load(bytes);}}```5. **动态加载嵌入的DLL**:`CurrentDomain_AssemblyResolve` 方法是一个事件处理函数,会在程序运行期间尝试加载找不到的DLL时被调用。在这个方法中,我们通过ResourceManager从嵌入的资源中获取DLL的字节流,并使用`Assembly.Load`将其加载为Assembly对象,从而实现动态加载。通过以上步骤,我们可以将依赖的DLL嵌入到EXE文件中,使得程序在运行时能够自动处理这些依赖。这种方法简化了部署过程,减少了用户因缺少依赖而遇到的问题,但同时也增加了EXE文件的大小。请注意,这种方法仅适用于那些不需要在运行时动态加载或卸载的DLL。对于需要动态加载的库,可能需要使用其他技术,如.NET Framework的延迟加载特性或使用第三方库。