首页 > C#类库引用类库

C#类库引用类库

我现在写了一个类库(.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#》


我记得是可以的,你看看编译的选项里面肯定有。


ILMerge 命令行
http://www.microsoft.com/en-us/downlo...
ILMERGE-GUI
http://ilmergegui.codeplex.com/

【热门文章】
【热门文章】