2つのDLLファイルをEXEファイルに含めて、配布を容易にします。これを行う方法を少し読んで、良いスレッド here 、および here ですが、私にとってはあまりにも複雑すぎるので、これを行う方法に関する基本的な説明が必要です。
私はMicrosoft Visual C#Express 2010を使用していますが、「低標準」の質問を言い訳してください。しかし、私は他の誰よりも1〜2レベル下にいるように感じます:-/ステップバイステップガイドの私のEXE、これは本当に素晴らしいでしょう!
.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
cd C:\test
/out:finish.exe
置換finish.exe
任意のファイル名。/out:finish.exe
結合するファイルを指定する必要があります。ilmerge および ilmergre gui をダウンロードします。これらを使用してファイルを結合するのがとても簡単になり、うまく機能します
Costura.Fody を使用します。
nuget をインストールしてからbuildを実行するだけです。最終的な実行可能ファイルはstandaloneになります。
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;
};
}
}
ILMergeをインストールする 他のスレッドが指示するとおり
次に、デフォルトでC:\Program Files (x86)\Microsoft\ILMerge
のインストールフォルダに移動します
DllとExesをそのフォルダーにドラッグします
そのフォルダーでShiftキーを押しながら右クリックし、[開く]コマンドの[プロンプト]を選択します。
書く
ilmerge myExe.exe Dll1.dll /out:merged.exe
Exeを最初に記述する必要があることに注意してください。
マージされたexeがあります。これを複数回実行する場合、これは最善の方法ではないかもしれませんが、一度だけ使用する最も簡単な方法であるため、Ilmergeをパスに配置することをお勧めします。
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をプロジェクトリソースに追加します。フォルダ「リソース」を追加します
また、GUIインターフェイスでコードプレックスで ilmergertool を使用できます。
VB.NET
についても同様の質問に答えました。ただし、変換するのは難しくありません。 DLL's
をRessource
フォルダーに埋め込み、最初の使用時にAppDomain.CurrentDomain.AssemblyResolve
イベントが発生します。
開発中に参照したい場合は、通常のDLL
参照をプロジェクトに追加するだけです。
注:非ILOnlyアセンブリをロードしようとしている場合、
Assembly.Load(block)
動作せず、例外がスローされます: 詳細
私は一時ファイルを作成してこれを克服し、
Assembly.LoadFile(dllFile)
解決策が見つかりました以下はStpesです:-
複数の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
公式ドキュメント です。これもステップ2で自動的にダウンロードされます。
以下は本当に簡単な方法で、.NET framework 4.6.1
を使用してアプリを正常に作成しました。
GuiまたはコマンドラインからILMerge nugetパッケージをインストールします。
Install-Package ilmerge
ダウンロードしたことを確認します。今すぐインストールします(このコマンドはわかりませんが、nugetパッケージに移動してください): 注:複数のソリューションがある場合は、おそらくソリューションの1つにのみインストールする必要があります
ソリューションフォルダーに移動し、パッケージフォルダーに「ILMerge」と実行可能ファイルが表示されます。
\FindMyiPhone-master\FindMyiPhone-master\packages\ILMerge.2.14.1208\tools
ここに実行可能ファイルがあります。実行可能ファイルを\bin\Debug
(またはアプリのビルド場所)にコピーしてから、コマンドライン/ Powershellで以下のようなことを行います。
ILMerge.exe myExecutable.exe myDll1.dll myDll2.dll myDlln.dll myNEWExecutable.exe
これで、すべてのライブラリを1つにした新しい実行可能ファイルが作成されます。