2013-12-23 53 views
1

我有一个.NET解决方案,我正在写最后的结果是一个类库(我应该给客户端一个DLL文件,他可以参考并在他的项目中使用)。作为嵌入式资源的类库 - 可以完成吗?

我的解决方案包括:

  • 类库(我们称之为MyClassLib) - 这是我应该给客户
  • 工具类库实际类库 - 这个类库包含这并不是实际MyClassLib的一部分,但它里面被使用(并为此引用的话)
  • 控制台应用程序的工具 - 测试MyClassLib(usless客户端)

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

我只想给客户端一个DLL文件(MyClassLib),该DLL即使不使用它也不知道如何使用Tools。

我想知道是否有任何方法在MyClassLib中嵌入工具引用。如果是这样,怎么样?如果没有,你会在这种情况下做什么?

谢谢

+2

您可以使用[ILMerge](http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx)。 –

回答

0

我有惊人的结果LibZ。你可以把所有东西合并在一起。我使用它将所有内容合并到一个安装程序.exe中,但它也适用于.dll。

3

This post杰弗里里希特告诉你如何做到这一点。

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

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

+0

在lib/dll中使用AssemblyResolve方法对最终用户来说可能是讨厌的。 ILMerge或[ILRepack](https://github.com/gluck/il-repack)通常是更好的方法。 – Gluck

+0

@Gluck - 是什么让AssenblyResolve讨厌最终用户? – Nir

+0

AssemblyRes对于AppDomain是全局的,在运行时静态初始化时,将调用*每个*类型的解析错误,无法关闭/优先化。也无法编译env(例如,VS可能会抱怨说,当您使用这样的“解析器”引用它时,它不会找到依赖库) – Gluck

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导入或引用。

+0

非常好。肯定会放弃这一点。 – crunchy