Weg*_*ged 65
这对我来说就像一个魅力:)它完全免费.
在博客消失的情况下添加代码.
.csproj文件中:<Target Name="AfterResolveReferences">
<ItemGroup>
<EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
<LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
</EmbeddedResource>
</ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)
Program.cs看起来像这样:[STAThreadAttribute]
public static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
App.Main();
}
Run Code Online (Sandbox Code Playgroud)
OnResolveAssembly方法:private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
Assembly executingAssembly = Assembly.GetExecutingAssembly();
AssemblyName assemblyName = new AssemblyName(args.Name);
var path = assemblyName.Name + ".dll";
if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false) path = String.Format(@"{0}\{1}", assemblyName.CultureInfo, path);
using (Stream stream = executingAssembly.GetManifestResourceStream(path))
{
if (stream == null) return null;
var assemblyRawBytes = new byte[stream.Length];
stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
return Assembly.Load(assemblyRawBytes);
}
}
Run Code Online (Sandbox Code Playgroud)
Sim*_*mon 48
Costura Fody是一个开源工具,旨在处理合并wpf程序集.
https://github.com/Fody/Costura#how-it-works
Tim*_*tei 13
{smartassembly}就是这样一个产品.它可以阻止或嵌入你的dll.
试试这个:http://www.smartassembly.com/
您还可以对应用程序进行大量改进,以便更快地运行.
是的.您可以将它用于WPF.
更新2015年6月6日:ILRepack 2.0.0(ILMerge的开源替代品)现在支持大多数合并的WPF案例:https://twitter.com/Gluckies/status/607680149157462016
作为上公布ILMerge网站,把这些dll作为ressources,从杰弗里里希特这里:
许多应用程序由依赖于许多DLL文件的EXE文件组成.部署此应用程序时,必须部署所有文件.但是,有一种技术可用于部署单个EXE文件.首先,确定您的EXE文件所依赖的所有DLL文件,这些文件不作为Microsoft .NET Framework本身的一部分提供.然后将这些DLL添加到Visual Studio项目中.对于您添加的每个DLL文件,显示其属性并将其"构建操作"更改为"嵌入式资源".这会导致C#编译器将DLL文件嵌入到EXE文件中,您可以部署此一个EXE文件.在运行时,CLR将无法找到依赖的DLL程序集,这是一个问题.要解决此问题,请在应用程序初始化时,使用AppDomain的ResolveAssembly事件注册回调方法.代码看起来应该是这样的:
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);
}
};
Run Code Online (Sandbox Code Playgroud)
现在,第一次线程调用引用依赖DLL文件中的类型的方法时,将引发AssemblyResolve事件,并且上面显示的回调代码将找到所需的嵌入式DLL资源,并通过调用Assembly的Load方法的重载来加载它.以Byte []为参数.
使用Costura.Fody - 它可以作为Nuget Pkg使用,以便在装配中嵌入资源的最佳和最简单的方法.
Install-Package Costura.Fody
Run Code Online (Sandbox Code Playgroud)
将其添加到项目后,它会自动将所有添加的引用嵌入到主程序集中.