我有两个DLL文件,我想将它们包含在我的EXE文件中,以便更容易分发它。我已经在这里阅读了一些如何做到这一点,甚至找到了一个好的线程here和here,但这对我来说太复杂了,我需要真正的基本指令来说明如何做到这一点
我正在使用Microsoft Visual C#Express 2010,请原谅我的“低标准”问题,但我觉得我比其他人的经验低一两级: - /如果有人可以指出如何合并这些DDL文件分步指南进入我的EXE,这将真的真棒!
答案 0 :(得分:83)
对于.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
后面你必须提供你想要的文件
组合。答案 1 :(得分:25)
下载ilmerge和ilmergre gui。使加入文件变得如此简单 香港专业教育学院使用这些并且工作得很好
答案 2 :(得分:16)
将DLL引用到您的Resources,并使用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;
};
}
}
答案 3 :(得分:16)
使用Costura.Fody。
您只需安装nuget,然后进行构建。最终的可执行文件将是独立。
答案 4 :(得分:10)
答案 5 :(得分:8)
Install ILMerge 正如其他主题告诉你的那样
然后转到安装文件夹,默认情况下
C:\Program Files (x86)\Microsoft\ILMerge
将您的Dll和Exes拖到该文件夹
按住Shift键并右键单击该文件夹,然后选择打开命令提示符
写
ilmerge myExe.exe Dll1.dll /out:merged.exe
请注意,您应首先编写您的exe。
你有合并的exe。如果你去的话,这可能不是最好的方式 多次这样做,但是最简单的一次使用,我愿意 建议把Ilmerge放在你的路上。
答案 6 :(得分:5)
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添加到项目资源中。添加文件夹“资源”
答案 7 :(得分:2)
此外,您可以在带有GUI界面的codeplex中使用ilmergertool 。
答案 8 :(得分:0)
我为VB.NET
回答了类似的问题。然而,转换它不应该太难。您将DLL's
嵌入到Ressource
文件夹中,并在第一次使用时将其嵌入
AppDomain.CurrentDomain.AssemblyResolve
事件被触发。
如果您想在开发期间引用它,只需为项目添加正常的DLL
引用。
答案 9 :(得分:0)
这是official documentation。这也会在第2步自动下载。
以下是一种非常简单的方法,我使用.NET framework 4.6.1
通过gui或命令行安装ILMerge nuget包:
Install-Package ilmerge
导航到您的解决方案文件夹,在packages文件夹中,您应该看到&#39; ILMerge&#39;可执行文件:
\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
现在,您将拥有一个新的可执行文件,其中包含所有库!
答案 10 :(得分:0)
注意:如果您尝试加载非ILOnly程序集,那么
Assembly.Load(block)
将无效,将抛出异常: more details
我通过创建一个临时文件并使用
克服了这个问题Assembly.LoadFile(dllFile)
答案 11 :(得分:0)
我找到了解决方案以下是Stpes: -
对于多个Dll: -
C:\ Program Files(x86)\ Microsoft \ ILMerge&gt; 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
答案 12 :(得分:0)
2019更新(仅供参考):
从 .NET Core 3.0 开始,out of the box支持此功能。要利用单文件可执行文件发布的优势,只需将以下行添加到项目配置文件中:
<PropertyGroup>
<PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>
现在,dotnet publish
应该在不使用任何外部工具的情况下生成一个.exe文件。
有关此功能的更多文档,请访问https://github.com/dotnet/designs/blob/master/accepted/single-file/design.md。
答案 13 :(得分:-2)
该命令应该是以下脚本:
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