登录

C#类库引用类库

我现在写了一个类库(.dll),在这个类库中引用了另一个第三方类库,如何把这个第三方类库嵌入我的类库中,就是说编译后只有我的dll文件?

# C
代言 代言 2487 天前 872 次浏览

全部回复(1) 我要回复

  • 大家讲道理

    大家讲道理2016-11-07 14:44:58

    许多应用程序都由一个要依赖于众多 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#》


    回复
    0
  • 取消 回复 发送