wpf中將引用的dll文件打包到exe中


業務場景:在做一個打包程序中,需要引用到一個ICSharpCode.SharpZipLib.dll的第三方庫,編譯之后dll需要生成到目錄里面exe才能使用,但是只想給用戶發送一個純exe的安裝文件,不想有關聯的引用,怎么辦呢?提供一種方法:

1、將dll文件以資源的方式包含到項目中,再進行引用

 

2、在程序入口添加程序集解析事件(wpf的App.xaml.cs文件)

protected override void OnStartup(StartupEventArgs e)
{
  base.OnStartup(e);
  //添加程序集解析事件
  AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;

}

private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
  Assembly executingAssembly = Assembly.GetExecutingAssembly();
  var executingAssemblyName = executingAssembly.GetName();
  var resName = executingAssemblyName.Name + ".resources";

  AssemblyName assemblyName = new AssemblyName(args.Name); string path = "";
  if (resName == assemblyName.Name)
  {
    path = executingAssemblyName.Name + ".g.resources"; ;
  }
  else
  {
    path = assemblyName.Name + ".dll";
    if (assemblyName.CultureInfo != null && 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;

    byte[] assemblyRawBytes = new byte[stream.Length];
    stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
    return Assembly.Load(assemblyRawBytes);
  }
}

 

3、更改.csproj的項目文件

 

在Import節點后面添加如下代碼

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

 

 

原理:就是將dll文件以資源的方式嵌入包含到項目中,編譯后目錄里面仍然會編譯出dll,我們將dll刪除,發現程序仍然能運行,這是因為我們在入口注冊了程序集解析事件

當程序集解析引用異常或有相關錯誤時,會進入事件,在事件中我們將嵌入的dll文件以流的方式映射加載,就相當於重新加載了刪除的dll文件

 

網上好像還有別的方法如引用第三方庫Fody.Costura(未測)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM