现在,已经是2015年了,您可以使用Costura.Fody来实现这个功能。使用它只需要将NuGet包添加到您的项目中并重新编译即可。我不确定它是否适用于Visual Studio 2005,因为那时还没有到2008年。但是我在几个项目中使用过它,效果非常好。
Fody是一个通用的代码编织器,它是免费且开源的。其基本思想是允许对编译后的.NET代码进行后处理,以增强其功能。例如,可以在每个方法调用中添加日志等功能。在我们的情况下,它将依赖的DLL文件打包到程序集资源中,以便在程序运行时加载它们,就像它们是独立的依赖项一样。
现在是2021年,对此的支持已经取得了巨大的进步。
如果你已经使用.NET 5(它支持Windows Forms!),那么你可以创建一个单文件exe,甚至可以嵌入本地二进制文件。你必须从命令行运行发布命令,但它将生成一个单独的exe文件,并将任何配置或内容文件与之一起。目标机器上不需要安装dotnet sdk。
dotnet.exe publish YourProject.csproj -f net5.0 -o package/win-x64 -c Release -r win-x64 /p:PublishTrimmed=true /p:TrimMode=Link /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true
一些注意事项:
PublishTrimmed
可以设置为 false
,以避免在反射使用较多的情况下进行代码删除。TrimMode
可以设置为 copyused
或 link
。更多详细信息请参见:https://learn.microsoft.com/en-us/dotnet/core/deploying/trim-self-contained。-f
参数指定框架版本,即 net5.0 等。-c
参数是配置,通常为 Release
。-r
参数是要构建的运行时,可以是 win-x86
、win-x64
和 linux-x64
。也可能有 ARM 的选项。-o
参数是输出文件夹。完整参考文档:https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-publish
有一个叫做.NET Reactor的第三方工具可以帮助您实现此目的。我没有使用过该工具,所以不确定它的工作效果如何。
netz -s application.exe foo.dll bar.dll
Jeffrey Richter在他的书摘中写道,可以注册一个带有应用程序域ResolveAssembly事件的回调方法,以使CLR在程序初始化期间找到第三方程序集和DLL文件:
AppDomain.CurrentDomain.AssemblyResolve += (sender,
args) => {
String resourceName = "AssemblyLoadingAndReflection." +
new AssemblyName(args.Name).Name + ".dll";
using (var stream =
Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)){
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
};
正如所说,您可以使用ILMerge。
然而,如果您使用免费的Phoenix保护程序,也可以保护您的代码,这可能会更容易些。