类库作为嵌入式资源 - 可以做到吗?

时间:2013-12-23 07:12:12

标签: c# .net class-library

我有一个.NET解决方案,我写的最终结果是一个类库(我应该给客户端一个他可以在他的项目中引用和使用的DLL文件)。

我的解决方案包括:

  • 类库(我们称之为MyClassLib) - 这是我应该给客户端的实际类库
  • 工具类库 - 此类库包含的工具不属于实际的MyClassLib,但在其中使用(并由此引用)
  • 控制台应用程序 - 测试MyClassLib(对于客户端无用)

当我按预期发布时,我会看到DLL文件 - 一个用于MyClassLib,另一个用于工具。

我只想给客户端一个DLL文件(MyClassLib),并且该DLL将知道如何使用Tools,即使它没有与它一起复制。

我想知道是否有任何方法可以在MyClassLib中嵌入Tools参考。如果是这样,怎么样?如果没有,在这种情况下你会做什么?

由于

3 个答案:

答案 0 :(得分:3)

Jeffrey Richter的

This post向您展示了如何做到这一点。

基本上,您使用AppDomain.CurrentDomain.AssemblyResolve事件拦截程序集加载并从资源返回程序集。

或者,您可以使用ILMerge,这是一个可以将多个程序集组合到一个文件中的实用程序。

答案 1 :(得分:3)

陈旧,但会为未来的寻求者发布。

像这样建立一个类:

class Extractor
{
    public static void ExtractResourceToFile(string resourceName, string filename)
    {
        if (!System.IO.File.Exists(filename))
            using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
            using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
            {
                byte[] b = new byte[s.Length];
                s.Read(b, 0, b.Length);
                fs.Write(b, 0, b.Length);
            }
    }
}

然后,添加

Extractor.ExtractResourceToFile("NAMESPACE.YOURDLL.dll", "YOURDLL.dll");

到您的主文件。

为了实现这一点,只需添加为现有文件,然后使用构建操作嵌入式资源

适用于任何第三方dll,您当然可以同时使用dll导入或引用。

答案 2 :(得分:0)

我在LibZ获得了惊人的成绩。你可以把所有东西合并在一起。我用它将所有东西合并到一个安装程序.exe中,但它也适用于.dll。