近日用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程序了