zoukankan      html  css  js  c++  java
  • DLL嵌入exe中

    1) 利用NUGet下载 ILMerge.MSBuild.Tasks

    PM> Install-Package ILMerge.MSBuild.Tasks

    2)把VS项目文件打开,用记事本 编辑

     <!-- Code to merge the assemblies into one:setup.exe -->
      <UsingTask TaskName="ILMerge.MSBuild.Tasks.ILMerge" AssemblyFile="$(SolutionDir)\packages\ILMerge.MSBuild.Tasks.1.0.0.3\tools\ILMerge.MSBuild.Tasks.dll" />
      <Target Name="AfterBuild">
        <ItemGroup>
          <MergeAsm Include="$(OutputPath)$(TargetFileName)" />
          <MergeAsm Include="$(OutputPath)LIB1_To_MERGE.dll" /> <!-- 这儿改成需要做嵌入的dll名 -->
          <MergeAsm Include="$(OutputPath)LIB2_To_MERGE.dll" />
        </ItemGroup>
        <PropertyGroup>
          <MergedAssembly>$(ProjectDir)$(OutDir)MERGED_ASSEMBLY_NAME.exe</MergedAssembly>
        </PropertyGroup>
        <Message Text="ILMerge @(MergeAsm) -&gt; $(MergedAssembly)" Importance="high" />
        <ILMerge InputAssemblies="@(MergeAsm)" OutputFile="$(MergedAssembly)" TargetKind="SameAsPrimaryAssembly" />
      </Target>

     3) 可惜以上的配置不支持WPF,若要实现WPF嵌入dll,参考如下:

    http://www.digitallycreated.net/Blog/61/combining-multiple-assemblies-into-a-single-exe-for-a-wpf-application

    首先,修改项目文件.csproj,使所有dll自动嵌入为资源文件(加到项目文件最后即可):

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

    然后,在App.xaml中加入如下代码:
       public partial class App : Application
        {
            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.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);
                }
            }
    
            protected override void OnStartup(StartupEventArgs e)
            {
                base.OnStartup(e);
                AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
            }
        }

    dll嵌入exe后,目录中的dll就没用了,配置Post buid 脚本自动删除dll:

    cd $(TargetDir)
    del *.dll

    4) 有些情况下,以上方法也不行,那么可以尝试 Eazfuscator.NET

     Eazfuscator.NET以前免费,现在已经变成收费软件了,不过找个免费的3.3版本也可以支持VS2010和VS2012

  • 相关阅读:
    SQL SERVER CXPACKET-Parallelism Wait Type 的惯用解决方案
    服务器主体 "sa" 无法在当前安全上下文下访问数据库 XXX[SQLSTATE 08004] (错误 916). 该步骤失败。
    Android 使用 aapt 命令查看 apk 包名
    Android数据库GreenDao的使用总结
    NestedScrollView、ScrollView 加载完自动滑动至底部问题的解决方案
    Android框架式编程之Retrofit
    Visual Studio 开发(三):Visual Studio 使用时常见问题解决方案
    Android 网络交互之移动端与服务端的加密处理
    Android框架式编程之ViewModel
    Android框架式编程之LiveData
  • 原文地址:https://www.cnblogs.com/jianyi0115/p/2989323.html
Copyright © 2011-2022 走看看