c# WPF程序将dll文件嵌入到exe文件中

近日用c# 的wpf编写了一个读取设备数据的exe程序。在最后如何打包的时候犯了难,网上找了很多文章,但是说的不是很详细,只有关键的代码。对于我这才接触c# 两周的人来说 那就是一脸懵逼。最后还是在网易云课堂上找到了相关视频。在这里我详解的贴一下步骤吧!我用的编辑器版本是Visual Studio 2019

一、首先要在debug模式下跑一遍确保debug文件夹内有文件生成,因为我之前就试过没跑就直接打包了,结果生成的exe文件不知道道输出到哪里去了,找了半天累死个人。

二、点解红框内的按钮 切换文件试图

 

三、打开后缀.csproj文件 翻到最后面 在最后添加如下代码。

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

不用改动直接粘贴就行了

四、打开App.xaml.cs文件,添加以下代码

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;
        }

五、将试图切换回sln,这时候会看见项目已卸载,右键点击项目选择重新加载项目,这时候在App.xaml.cs文件中可能会有报错的情况,将缺失的using导入即可。

六、右键点击项目选择重新生成

输出以上信息就表示生成成功了 ,这个时候debug目录下的exe文件就可以使用了

七、使用的时候可能会出现 “ windows无法访问指定设备路径或文件,你可能没有权限”的问题  这个时候邮件exe程序选择属性

切换到安全选项卡

点击编辑 再点击添加 最后点击高级

点击立刻查找  在列表内找到everyone 并选择 最后确定。此时就可以打开exe程序了

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值