WPF рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░рд┐рдирд┐рдпреЛрдЬрди: рдХрд┐рд╕реА рдПрдХрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ .NET рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛

рдЬрдм рдЖрдк рдХрдИ рдкреНрд░рдмрдВрдзрд┐рдд рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк ILMerge рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

ILMerge.exe /t:winexe /out:test.exe test1.exe test2.dll

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рджреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рд╕реЗ рдПрдХ рд╕рдВрдпреБрдХреНрдд рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред / T: winexe рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╡рд┐рдВрдбреЛ (WinForms) рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реЛрдЧрд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, ILMerge WPF рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛, рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WPF рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд XAML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рд╣реИ:

рдЗрд╕ рддрд░рд╣ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рд╕рдВрдпреЛрдЬрди рдХрд░рддреЗ рд╕рдордп, ILMerge рдХреЛ BAML рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рд╕рднреА рдкрд╣реБрдВрдЪ URI рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ: рдПрдореНрдмреЗрдбреЗрдб рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдореНрдмреЗрдбреЗрдб рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рдЕрдВрджрд░ рд░рдЦрдирд╛ред

рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рд╕реНрд╡рддрдГ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, Microsoft.CSharp.targets рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдирд┐рдореНрди рд▓рдХреНрд╖реНрдп рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

 <Target Name="AfterResolveReferences"> <ItemGroup> <EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'"> <LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName> </EmbeddedResource> </ItemGroup> </Target> 

ResolveAssemblyReference рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЗрд╕ рд▓рдХреНрд╖реНрдп рдХреА рдЙрдкрд▓рдмреНрдзрд┐ рд╣реЛрддреА рд╣реИред рдЗрд╕ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рдПрдореНрдмреЗрдбреЗрдб рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕рд╛рдзрди рдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдФрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдореНрдмреЗрдбреЗрдб рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдирд╛рдордХрд░рдг рдореЗрдВ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдФрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╣реА рдирд╛рдо рд╣реЛрддрд╛ рд╣реИред

рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреИрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ WPF рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
WPF рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП "рдореИрдЬрд┐рдХ" рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ App.xaml рдлрд╝рд╛рдЗрд▓ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, App.xaml рдХреЛ App.g.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдУрдмреНрдЬреЗрдХреНрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред App.g.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдорд╛рдирдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╣реИ - рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдореБрдЦреНрдпред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, WPF рдХрд░реНрдиреЗрд▓ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдиреЗрд╕реНрдЯреЗрдб рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдорд╛рдирдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

 public class Program { [STAThread] public static void Main() { App.Main(); } } 

рдЫрд╡рд┐

рдЕрдВрддрд┐рдо рдЪрд░рдг AppDomain.AssemblyResolve рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдЕрдкрдирд╛ рд╣реИрдВрдбрд▓рд░ рд╣реИ, рдЬреЛ рд╣рд░ рдмрд╛рд░ рдорд╛рдирдХ рд▓реЛрдбрд░ рдЕрдЧрд▓реА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рднреМрддрд┐рдХ рд╕реНрдерд╛рди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

 public class Program { static Dictionary<string, Assembly> assembliesDictionary = new Dictionary<string, Assembly>(); [STAThread] public static void Main() { AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly; App.Main(); } private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args) { AssemblyName assemblyName = new AssemblyName(args.Name); Assembly executingAssembly = Assembly.GetExecutingAssembly(); string path = string.Format("{0}.dll", assemblyName.Name); if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false) { path = String.Format(@"{0}\{1}", assemblyName.CultureInfo, path); } if (!assembliesDictionary.ContainsKey(path)) { using (Stream assemblyStream = executingAssembly.GetManifestResourceStream(path)) { if (assemblyStream != null) { var assemblyRawBytes = new byte[assemblyStream.Length]; assemblyStream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length); using (var pdbStream = executingAssembly.GetManifestResourceStream(Path.ChangeExtension(path, "pdb"))) { if (pdbStream != null) { var pdbData = new Byte[pdbStream.Length]; pdbStream.Read(pdbData, 0, pdbData.Length); var assembly = Assembly.Load(assemblyRawBytes, pdbData); assembliesDictionary.Add(path, assembly); return assembly; } } assembliesDictionary.Add(path, Assembly.Load(assemblyRawBytes)); } else { assembliesDictionary.Add(path, null); } } } return assembliesDictionary[path]; } } 


рд╕рд╛рд░рд╛рдВрд╢


рдкреНрд░рд╕реНрддреБрдд рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИ рдФрд░ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд┐рд╕реА рднреА .NET рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдкреНрд░рдмрдВрдзрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕реНрд╡рдд: рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдореВрд▓реНрдп рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕рдВрдпреБрдХреНрдд рдЖрд╡реЗрджрди рдлрд╝рд╛рдЗрд▓ "рдУрд╡рд░рдмреЛрд░реНрдб" рдмрдиреА рд╣реБрдИ рд╣реИред

рд╕рдВрджрд░реНрдн:


1. рдПрдХ WPF рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг | msdn.microsoft.com/ru-ru/library/aa970678.aspx
2. MSBuild | msdn.microsoft.com/ru-ru/library/ms171452.aspx
3. рд╡реНрд▓рд╛рдж рдЪрд┐рд╕реНрддреНрдпрдХреЛрд╡: MSBuild | www.rsdn.ru/article/devtools/msbuild-05.xml
4. рдХрд╛рд░реНрдп рдХрд╛ рд╕рдорд╛рдзрд╛рди msdn.microsoft.com/ru-ru/library/9ad3f294.aspx
5. рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ | msdn.microsoft.com/ru-ru/library/ms366724.aspx
6. рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ | msdn.microsoft.com/ru-ru/library/ff527268.aspx2
7. C # + WPF + рдерд░реНрдб рдкрд╛рд░реНрдЯреА рдЕрд╕реЗрдВрдмрд▓реА -> рдПрдХ .exe-shnik | habrahabr.ru/blogs/personal/67836

рдЕрдВрддрднрд╛рд╖рдг


рдЬреВрди 2012 рдореЗрдВ, рдХреЙрд╕реНрдЯреВрд░рд╛ рдУрдкрдирд╕реЛрд░реНрд╕ рдкреНрд▓рдЧ-рдЗрди рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ 2010 рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/In126790/


All Articles