web-dev-qa-db-ja.com

Merge DLL= EXE?

2つのDLLファイルをEXEファイルに含めて、配布を容易にします。これを行う方法を少し読んで、良いスレッド here 、および here ですが、私にとってはあまりにも複雑すぎるので、これを行う方法に関する基本的な説明が必要です。

私はMicrosoft Visual C#Express 2010を使用していますが、「低標準」の質問を言い訳してください。しかし、私は他の誰よりも1〜2レベル下にいるように感じます:-/ステップバイステップガイドの私のEXE、これは本当に素晴らしいでしょう!

52
Momro

.NET Framework 4.5の場合

ILMerge.exe /target:winexe /targetplatform:"v4,C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" /out:finish.exe insert1.exe insert2.dll

ILMerge

  1. CMDを開き、ディレクトリに移動します。まあ言ってみれば: cd C:\test
  2. 上記のコードを挿入します。
  3. /out:finish.exe置換finish.exe任意のファイル名。
  4. の後ろ /out:finish.exe結合するファイルを指定する必要があります。
85
Yuki Kutsuya

ilmerge および ilmergre gui をダウンロードします。これらを使用してファイルを結合するのがとても簡単になり、うまく機能します

25
Kieran Hill

Costura.Fody を使用します。

nuget をインストールしてからbuildを実行するだけです。最終的な実行可能ファイルはstandaloneになります。

20
Igor Popov

DLLをリソースに参照し、AssemblyResolve-Eventを使用してResource-DLLを返します。

public partial class App : Application
{
    public App()
    {
        AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
        {

            Assembly thisAssembly = Assembly.GetExecutingAssembly();

            //Get the Name of the AssemblyFile
            var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";

            //Load form Embedded Resources - This Function is not called if the Assembly is in the Application Folder
            var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
            if (resources.Count() > 0)
            {
                var resourceName = resources.First();
                using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
                {
                    if (stream == null) return null;
                    var block = new byte[stream.Length];
                    stream.Read(block, 0, block.Length);
                    return Assembly.Load(block);
                }
            }
            return null;
        };
    }
}
16
Destructor

ダウンロード

ILMerge

コール

ilmerge /target:winexe /out:c:\output.exe c:\input.exe C:\input.dll
10
TheVoidSeeker
  1. ILMergeをインストールする 他のスレッドが指示するとおり

  2. 次に、デフォルトでC:\Program Files (x86)\Microsoft\ILMergeのインストールフォルダに移動します

  3. DllとExesをそのフォルダーにドラッグします

  4. そのフォルダーでShiftキーを押しながら右クリックし、[開く]コマンドの[プロンプト]を選択します。

  5. 書く

    ilmerge myExe.exe Dll1.dll /out:merged.exe
    

    Exeを最初に記述する必要があることに注意してください。

マージされたexeがあります。これを複数回実行する場合、これは最善の方法ではないかもしれませんが、一度だけ使用する最も簡単な方法であるため、Ilmergeをパスに配置することをお勧めします。

8
Henrik Karlsson
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
    /* PUT THIS LINE IN YOUR CLASS PROGRAM MAIN() */           
        AppDomain.CurrentDomain.AssemblyResolve += (sender, arg) => { if (arg.Name.StartsWith("YOURDLL")) return Assembly.Load(Properties.Resources.YOURDLL); return null; }; 
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

最初にDLLをプロジェクトリソースに追加します。フォルダ「リソース」を追加します

6
Paulos02

また、GUIインターフェイスでコードプレックスで ilmergertool を使用できます。

2
Zain Ali

VB.NETについても同様の質問に答えました。ただし、変換するのは難しくありません。 DLL'sRessourceフォルダーに埋め込み、最初の使用時にAppDomain.CurrentDomain.AssemblyResolveイベントが発生します。

開発中に参照したい場合は、通常のDLL参照をプロジェクトに追加するだけです。

DLLプロジェクトへの埋め込み

0
Alex

注:非ILOnlyアセンブリをロードしようとしている場合、

Assembly.Load(block)

動作せず、例外がスローされます: 詳細

私は一時ファイルを作成してこれを克服し、

Assembly.LoadFile(dllFile)
0
BoJl4apa

解決策が見つかりました以下はStpesです:-

  1. ILMerge.msiをダウンロードして、マシンにインストールします。
  2. コマンドプロンプトを開く
  3. cd C:\ Program Files(x86)\ Microsoft\ILMerge Preess Enterと入力します
  4. C:\ Program Files(x86)\ Microsoft\ILMerge> ILMerge.exe/target:winexe /targetplatform:"v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 "/out:NewExeName.exe SourceExeName.exe DllName.dll

複数のDLLの場合:-

C:\ Program Files(x86)\ Microsoft\ILMerge> ILMerge.exe/target:winexe /targetplatform:"v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 "/out:NewExeName.exe SourceExeName.exe DllName1.dll DllName2.dll DllName3.dll

0
Rahul Singh

公式ドキュメント です。これもステップ2で自動的にダウンロードされます。

以下は本当に簡単な方法で、.NET framework 4.6.1を使用してアプリを正常に作成しました。

  1. GuiまたはコマンドラインからILMerge nugetパッケージをインストールします。

    Install-Package ilmerge
    
  2. ダウンロードしたことを確認します。今すぐインストールします(このコマンドはわかりませんが、nugetパッケージに移動してください): enter image description here 注:複数のソリューションがある場合は、おそらくソリューションの1つにのみインストールする必要があります

  3. ソリューションフォルダーに移動し、パッケージフォルダーに「ILMerge」と実行可能ファイルが表示されます。

    \FindMyiPhone-master\FindMyiPhone-master\packages\ILMerge.2.14.1208\tools
    

    enter image description here

  4. ここに実行可能ファイルがあります。実行可能ファイルを\bin\Debug(またはアプリのビルド場所)にコピーしてから、コマンドライン/ Powershellで以下のようなことを行います。

    ILMerge.exe myExecutable.exe myDll1.dll myDll2.dll myDlln.dll myNEWExecutable.exe
    

これで、すべてのライブラリを1つにした新しい実行可能ファイルが作成されます。

0
benscabbia