我有两个 DLL 文件,我想将它们包含在我的 EXE 文件中,以便于分发它。我在这里和那里阅读了一些如何做到这一点,甚至在这里和这里找到了一个很好的线程,但这对我来说太复杂了,我需要关于如何做到这一点的真正基本说明。
我正在使用 Microsoft Visual C# Express 2010,请原谅我的“低标准”问题,但我觉得我比其他人的经验低一两个级别:-/ 如果有人能指出如何将这些 DDL 文件合并到我的 EXE 在一步一步的指南中,这真的很棒!
对于 .NET 框架 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
你必须给你想要合并的文件。使用Costura.Fody。
您只需要安装nuget然后进行构建。最终的可执行文件将是独立的。
下载ilmerge和ilmergre gui。使加入文件变得如此容易,我使用了这些并且效果很好
将 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 添加到您的项目资源中。添加文件夹“资源”
2019更新(仅供参考):
从.NET Core 3.0开始,开箱即可支持此功能。要利用单文件可执行文件发布,只需将以下行添加到项目配置文件中:
<PropertyGroup>
<PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>
现在,dotnet publish
应该在不使用任何外部工具的情况下生成单个 .exe 文件。
有关此功能的更多文档,请访问https://github.com/dotnet/designs/blob/master/accepted/single-file/design.md。
您也可以在带有 GUI 界面的 codeplex 中使用 ilmergertool。
这是官方文档。这也会在第 2 步自动下载。
下面是一个非常简单的方法,我已经成功地构建了我的应用程序.NET framework 4.6.1
通过 gui 或命令行安装 ILMerge nuget 包:
Install-Package ilmerge
确认您已下载它。现在安装(不确定此命令,但只需转到您的 nuget 包): 注意:如果您有多个解决方案,您可能只需要为您的一个解决方案安装它
导航到您的解决方案文件夹,在包文件夹中,您应该会看到带有可执行文件的“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
您现在将拥有一个新的可执行文件,其中包含所有库!
我回答了一个类似的问题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
该命令应该是以下脚本:
ilmerge myExe.exe Dll1.dll /target:winexe /targetplatform:"v4,c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\" /out:merged.exe /out:merged.exe