2016-11-10 2 views
2

私は、dllをプロジェクト出力exeにマージする方法について、長い時間から探しています。ビルド時にすべての従属アセンブリをExeにマージ

Vitevic Assembly Embedderがインストールされていますが、プロジェクトがビルドされても、そのままdllファイルの一部がそのまま残ります。

私は約を聞いて以来ILMergeしかし、私は有用なサポートを見つけることができませんでした。 すべてのdllをマージできるツールが必要です。

+0

FodyのDLLマージ用。 –

+1

@パトリック私は[ここ](http://tech.trailmax.info/2014/01/bundling-all-your-assemblies-into-one-or-alternative-to-ilmerge/)からCoustra Foudyをたどった!伝説の – Umar

答えて

0

これは私が通常何をすべきかです:

  1. ストア(「LIBS」のような)ソリューション内のいくつかのフォルダ内のすべてのDLL。
  2. Inside VSは、 "Embedded Resource"へのすべてのDLLの "Build Action"を変更します。これはexeファイル内にActallファイルを "保存"します。あなたは、外部のアセンブリのいずれかを使用
  3. 場所Mainメソッドで、このコード、またはどこかの前に:

    またAppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

この:私は常にCostura使用してきた

private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var thisAssembly = Assembly.GetExecutingAssembly(); 

     var assemblyName = new AssemblyName(args.Name); 
     var dllName = assemblyName.Name + ".dll"; 

     var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(dllName)); 
     if (resources.Any()) 
     { 
      var resourceName = resources.First(); 
      using (var stream = thisAssembly.GetManifestResourceStream(resourceName)) 
      { 
       if (stream == null) return null; 
       var block = new byte[stream.Length]; 

       try 
       { 
        stream.Read(block, 0, block.Length); 
        return Assembly.Load(block); 
       } 
       catch (IOException) 
       { 
        return null; 
       } 
       catch (BadImageFormatException) 
       { 
        return null; 
       } 
      } 
     } 

     return null; 
    } 
+0

System.httpなどのシステムリファレンスはどうですか?それは働くでしょうか? – Umar

+0

アセンブリをどのように参照できますか?各アセンブリを参照して、それを追加する必要がありますか? – Umar

+0

@Umarそれはあなたが提供するすべてのdllで動作します。したがって、 'assemblyName.Name +" .dll ";' –

関連する問題