84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
我现在写了一个类库(.dll),在这个类库中引用了另一个第三方类库,如何把这个第三方类库嵌入我的类库中,就是说编译后只有我的dll文件?
许多应用程序都由一个要依赖于众多 DLL 文件的 EXE 文件构成。部署这个应用程序时,所有文件都必须部署。然而,有一个技术允许只部署一个 EXE 文件。首先,标识出 EXE 文件要依赖的、同时不是作为 Microsoft .NET Framework 本身的一部分发布的所有 DLL 文件。然后,将这些 DLL 添加到你的 Visual Studio 项目中。对于添加的每个 DLL,都显示它的属性,并将它的“生成操作”更改为“嵌入的资源”。这会导致 C# 编译器将 DLL 文件嵌入 EXE 文件中,以后只需要部署这个 EXE 文件即可。
运行时,CLR 会找不到依赖的 DLL 程序集。为了解决这个问题,当应用程序初始化时,想 AppDomain 的 ResolveAssembly 事件登记一个回调方法。代码大致如下:
```C#
AppDomina.CurrentDomain.AssemblyResolve += (sender, args) => {String resourceName = "AssemblyLoadingAndReflection." +new AssemblyName(args.Name).Name + ".dll"; using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { Byte[] assemblyData = new Byte[stream.Length]; stream.Read(assemblyData, 0, assemblyData.Length); return Assembly.Load(assemblyData); } };
```
现在,一个线程首次调用一个方法时,如果发现该方法引用了依赖 DLL 文件中的一个类型,就会引发一个 AssemblyResolve 事件,而上述回调代码会找到所需的嵌入 DLL资源,并调用 Assembly 的 Load 方法的一个重载版本(这个版本要获取一个 Byte[] 实参),从而加载所需的资源。
摘录自《CLR via C#》
许多应用程序都由一个要依赖于众多 DLL 文件的 EXE 文件构成。部署这个应用程序时,所有文件都必须部署。然而,有一个技术允许只部署一个 EXE 文件。首先,标识出 EXE 文件要依赖的、同时不是作为 Microsoft .NET Framework 本身的一部分发布的所有 DLL 文件。然后,将这些 DLL 添加到你的 Visual Studio 项目中。对于添加的每个 DLL,都显示它的属性,并将它的“生成操作”更改为“嵌入的资源”。这会导致 C# 编译器将 DLL 文件嵌入 EXE 文件中,以后只需要部署这个 EXE 文件即可。
运行时,CLR 会找不到依赖的 DLL 程序集。为了解决这个问题,当应用程序初始化时,想 AppDomain 的 ResolveAssembly 事件登记一个回调方法。代码大致如下:
```C#
```
现在,一个线程首次调用一个方法时,如果发现该方法引用了依赖 DLL 文件中的一个类型,就会引发一个 AssemblyResolve 事件,而上述回调代码会找到所需的嵌入 DLL资源,并调用 Assembly 的 Load 方法的一个重载版本(这个版本要获取一个 Byte[] 实参),从而加载所需的资源。
摘录自《CLR via C#》