csproj技巧,以及使用其他类库冲突,以及引入第三方UI方式
1、在项目中我们经常写
string? Message{get;set;}
明明是引用类型,它底下还是会出现波浪线,我们可以打开csproj
找到Nullable将它改为disable,或者删除,它默认是disable
<Nullable>disable</Nullable>
2、我们的WPF中可能会使用到Winform的类库,添加UseWindowsForms,一定要写在UseWPF下面
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
3、定制语言,防止其他语言注入
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
在 C# 中,.csproj 文件是一个 XML 格式的文件,用于描述项目的结构和元数据,包括了代码文件、依赖项、编译选项、输出文件等。而 MSBuild 是一个通用的构建引擎,用于构建和部署 .NET 应用程序和其他类型的项目。MSBuild 可以通过执行指定的 .targets 和 .props 文件来执行构建操作,这些文件定义了一些属性和任务,用于控制构建过程中的行为和流程。
在 Visual Studio 中,.csproj 文件是由 MSBuild 来处理的。当您在 Visual Studio 中打开一个项目时,MSBuild 将会读取 .csproj 文件,并根据其中的内容生成一个项目对象模型(Project Object Model,POM)。POM 是一个内存中的表示项目的结构和元数据的对象,它包含了所有的配置信息、元素和属性。在 Visual Studio 中,您可以通过 Solution Explorer 或 Property Pages 窗口来查看和修改 POM。
在构建过程中,MSBuild 将会使用 POM 中的信息来执行构建操作。MSBuild 首先会执行 .props 文件中定义的属性,然后执行 .targets 文件中定义的任务,最后将生成的输出文件保存到指定的目录中。通过扩展 .props 和 .targets 文件,您可以自定义构建过程中的行为并添加自己的任务和属性。
总之,.csproj 文件和 MSBuild 引擎是密切相关的,.csproj 文件描述了项目的结构和元数据,而 MSBuild 引擎则负责执行构建操作并生成输出文件
但是程序运行后,我们会发现bin目录下的dll,json,exe,pdb文件杂乱无章
我们需要将dll分门别类,用到nulastudio.NetBeauty库
按照下面的方式写
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
</PropertyGroup>
<PropertyGroup>
<BeautySharedRuntimeMode>False</BeautySharedRuntimeMode>
<!-- beauty into sub-directory, default is libs, quote with "" if contains space -->
<BeautyLibsDir Condition="$(BeautySharedRuntimeMode) == 'True'">../libraries</BeautyLibsDir>
<BeautyLibsDir Condition="$(BeautySharedRuntimeMode) != 'True'">./libraries</BeautyLibsDir>
<!-- dlls that you don't want to be moved or can not be moved -->
<!-- <BeautyExcludes>dll1.dll;lib*;...</BeautyExcludes> -->
<!-- dlls that end users never needed, so hide them -->
<!-- <BeautyHiddens>hostfxr;hostpolicy;*.deps.json;*.runtimeconfig*.json</BeautyHiddens> -->
<!-- set to True if you want to disable -->
<DisableBeauty>False</DisableBeauty>
<!-- set to False if you want to beauty on build -->
<BeautyOnPublishOnly>False</BeautyOnPublishOnly>
<!-- DO NOT TOUCH THIS OPTION -->
<BeautyNoRuntimeInfo>False</BeautyNoRuntimeInfo>
<!-- set to True if you want to allow 3rd debuggers(like dnSpy) debugs the app -->
<BeautyEnableDebugging>False</BeautyEnableDebugging>
<!-- the patch can reduce the file count -->
<!-- set to False if you want to disable -->
<!-- SCD Mode Feature Only -->
<BeautyUsePatch>True</BeautyUsePatch>
<!-- App Entry Dll = BeautyDir + BeautyAppHostDir + BeautyAppHostEntry -->
<!-- see https://github.com/nulastudio/NetBeauty2#customize-apphost for more details -->
<!-- relative path based on AppHostDir -->
<!-- .NET Core Non Single-File Only -->
<!-- <BeautyAppHostEntry>bin/MyApp.dll</BeautyAppHostEntry> -->
<!-- relative path based on BeautyDir -->
<!-- .NET Core Non Single-File Only -->
<!-- <BeautyAppHostDir>..</BeautyAppHostDir> -->
<!-- <BeautyAfterTasks></BeautyAfterTasks> -->
<!-- valid values: Error|Detail|Info -->
<BeautyLogLevel>Info</BeautyLogLevel>
<!-- set to a repo mirror if you have troble in connecting github -->
<!-- <BeautyGitCDN>https://gitee.com/liesauer/HostFXRPatcher</BeautyGitCDN> -->
<!-- <BeautyGitTree>master</BeautyGitTree> -->
</PropertyGroup>
<ItemGroup>
<PackageReference Include="nulastudio.NetBeauty" Version="2.1.4.4" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="HandyControl" Version="3.5.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Prism.Wpf" Version="9.0.401-pre" />
<PackageReference Include="Prism.DryIoc" Version="9.0.401-pre" />
</ItemGroup>
</Project>
注意,需要我们新建VS自带的,个别模板会和NetBeauty冲突,例如Prism
他虽然会编译成功,但是会启动失败,这个时候我们要删除App.xaml和App.xaml.cs
启动改为下面形式
/// <summary>
/// 使用Prism自带的模板启动失败,删除App.xaml和App.xaml.cs
/// 改为Main方法启动
/// </summary>
public class Program
{
[STAThread]
public static void Main()
{
Application application = new Application();
MainWindow win=new MainWindow();
application.Run(win);
}
}
说到这了,我顺便说下删除App后的几种启动方式
[STAThread]
static void Main() {
Application app = new Application();
MainWindow win = new MainWindow();
app.MainWindow = win;
win.Show(); // 显示窗体
app.Run(); // 调用无参数的Run()方法
}
[STAThread]
static void Main() {
Application app = new Application();
app.StartupUri = new Uri("MainWindow.xaml",UriKind.Relative);
app.Run();
}
说到这里,再顺便说一句,我们如果把App.xaml删除了,那么我们使用第三方UI的时候怎么办呢
这是我使用Furiom框架写的WPF程序的启动,我是删除了App.xaml的,改用了
public class Program
{
[STAThread]
public static void Main(string[] args)
{
// Serve.RunGeneric();
Serve.RunNative(GetComponent());
var app = new Application();
app.Startup += (sender, e) =>
{
//程序启动加载上一次关闭时SetData的数据状态
// 加载类库中的主题资源
var themeResourceDictionary = ResourceExtension.LoadTheme();
Application.Current.Resources.MergedDictionaries.Add(themeResourceDictionary);
//WPF全局异常捕获
ThreadExceptionHandler handler = new ThreadExceptionHandler();
//UI线程抛出异常
// Application.Current.DispatcherUnhandledException += handler.Current_DispatcherUnhandledException;
//非UI线程抛出异常
// AppDomain.CurrentDomain.UnhandledException += handler.CurrentDomain_UnhandledException;
//Task线程抛出异常
// TaskScheduler.UnobservedTaskException += handler.TaskScheduler_UnobservedTaskException;
//扫描全局的json文件
// JsonExtension.GetDefaultJsonLevel();
};
if (Native.CreateInstance<LoginView>().ShowDialog() == true)
{
//关闭登录窗体
Native.CreateInstance<LoginView>().Close();
}
}
ResourceExtension是我自己定义的静态类
在这里我写两种方式供大家参考
/// <summary>
/// 加载资源字典的两种方式
/// </summary>
public static class ResourceExtension
{
public static ResourceDictionary Read()
{
var dictionaryXaml = @"
<ResourceDictionary xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source=""pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml"" />
<ResourceDictionary Source=""pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml"" />
<ResourceDictionary Source=""pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Blue.xaml"" />
<ResourceDictionary Source=""pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Indigo.xaml"" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>";
return (ResourceDictionary)System.Windows.Markup.XamlReader.Parse(dictionaryXaml);
}
public static ResourceDictionary LoadTheme()
{
// 加载资源字典
var resourceDictionary = new ResourceDictionary();
resourceDictionary.Source = new Uri("/System.MES.Theme;component/Properties/ApplicationResource.xaml", UriKind.RelativeOrAbsolute);
return resourceDictionary;
}
}
csproj技巧,以及使用其他类库冲突,以及引入第三方UI方式的更多相关文章
- Atitit 类库冲突解决方案 httpclient-4.5.2.jar
Atitit 类库冲突解决方案 httpclient-4.5.2.jar 错误提示如下1 版本如下(client and selenium)2 解决流程2 挂载源码 (SSLConnectionSo ...
- Atitit 类库冲突 解决方案
Atitit 类库冲突 解决方案 表现情况,找到不某些方法 类等,一个情况是真的找不到,一个情况是加载了错误的jar,导致正确的jar无法加载.. 1.1. 查找现在ide正在使用的jar1 1.2. ...
- xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误
xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误 一:场景 xcode 同时引入了 libA.a, libB.a 两个静态类库,如果 这两个静态类库之中 ...
- laravel5.3引入第三方类库的方法
laravel版本:5.3 今天做的是引入第三方的phpquery类库,方法: 在laravel的app目录下自定义一个文件夹,我用的名字是:Libs 然后直接将phpquery类库扔进这个目录 在c ...
- Laravel Controller中引入第三方类库
Laravel 引入第三方类库 在Controller中引入自定义的php文件,先在app目录下创建一个新的文件夹,命名Tools(可自定义),接着创建一个MyTest.php: <?php c ...
- 走进webpack(2)--第三方框架(类库)的引入及抽离
在当代的前端开发中,很少会用原生JS来开发页面,最基本的都会使用jQuery来节省我们开发的时间和效率,而angular,vue,react的出现更是为前端开发者带来了福音.那么这篇文章就说说如何用w ...
- TP3.2之引入第三方类库文件和普通.php文件
1.引入第三方类库 .class.php文件 1.1 类库有写namespace命名空间 namespace Org\Util; class Auth { } 保存到ThinkPHP/Library/ ...
- 180710-MySql插入唯一键冲突的三种可选方式
MySql插入时唯一键冲突的几种处理方式 MySql插入一条记录,结果提示主键冲突,怎么办? 批量插入数据时,发现插入的这批数据中,有某些记录存在唯一键冲突,一个一个跳出来就比较麻烦了,有什么好的办法 ...
- angular4(2-1)angular脚手架引入第三方类库(jquery)
欢迎加入前端交流群交流知识&&获取视频资料:749539640 如何在angular4脚手架中引入第三方类库呢比如jquery.swiper.bootstrap...... 例如引入j ...
- Laravel 引入第三方类库及自定义函数
1.新建一个目录放第三方类库 2.找到composer.json文件打开,在里面autoload 下classmap下面加入类库路径 3根目录下运行composer dumpautoload 4.使用 ...
随机推荐
- Java-获取当前时间并进行格式化
获取年月日 时分秒 import java.text.SimpleDateFormat; import java.util.Date; Date dt = new Date(); SimpleDate ...
- [Java] 详细解说final关键字
final final 可以修饰变量.方法和类,表示所修饰的内容一旦赋值之后就不会再被改变.例如String类就是一个final类型的类. 1.具体使用场景 1.1 变量 1.1.1 成员变量 每个类 ...
- 线性SVM决策过程的可视化
线性 SVM 决策过程的可视化 导入模块 from sklearn.datasets import make_blobs from sklearn.svm import SVC import matp ...
- 【Unity3D】缩放、平移、旋转场景
1 前言 场景缩放.平移.旋转有两种实现方案,一种是对场景中所有物体进行同步变换,另一种方案是对相机的位置和姿态进行变换. 对于方案一,如果所有物体都在同一个根对象下(其子对象或孙子对象),那 ...
- [攻防世界][Web]PHP2
打开靶机对应的url 就一行字 Can you anthenticate to this website? 第一感觉就需要做目录文件扫描 使用御剑和dirsearch进行扫描,发现一个文件 index ...
- SSH 客户端
简介 OpenSSH 的客户端是二进制程序 ssh.它在 Linux/Unix 系统的位置是/usr/local/bin/ssh. Linux 系统一般都自带 ssh,如果没有就需要安装. # Ubu ...
- 问题:RuntimeError: Model class LuffyAPI.apps.user.models.UserInfo doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
问题截图 报错原因 提示app未注册,但实际上已经注册的 1. # settings配置文件移动后要将这个settings添加到环境变量中 sys.path.insert(0, BASE_DIR) # ...
- 【LeetCode二叉树#04】判断对称二叉树、相同的树、另一棵子树、树的子结构(二叉树相等判断)
对称二叉树 力扣题目链接(opens new window) 给定一个二叉树,检查它是否是镜像对称的. 思路 本题中,不能单纯去比较左右子节点的是否对称(都有值且不为空) 因为如果按上面那样做的话,到 ...
- 老生常谈的iOS- weak原理,你真的懂得还是为了应付面试
前言 weak对于iOS开发来说只要解决一些对象相互引用的时候,避免出现强强引用,对象不能被释放,出现内存泄露的问题. weak 关键字的作用域弱引用,所引用对象的计数器不会加一,并在引用对象被释放的 ...
- iOS APP包瘦身,你在工作中真的会关注吗?
安装包组成 谈到 App 瘦身,最直接的想法莫过于分析一个安装包内部结构,了解其每一部分的来源.解压一个 ipa 包,拿到其 payload 中 app 文件的数据,整理归类后其大致如下: Exect ...