C# 踩坑记录

1.缺少命名空间 System.Drawing 以下的类

缺少命名空间 System.Drawing 以下的类,加入System.Drawing.Common 5.0.2版本,最新版本不懂为何不行  ,有时.NET Framework4.6 不行,要4.8

2. DML加速

    .NET ML识别DML加速只能在x64平台运行,其它平台会报错

3. webView2

webView2 引用异常 如https://bbs.csdn.net/topics/396650187

 有几点要特别注意的: 1。必须安装Edge Bate 2。在NuGet包管理,那里 必须勾选包含预发布版本,然后必须选择下载最新 -pre版本的包,千万不要下载正式版的包,包旁边有说明:正式版只给win32 C++使用,-pre预览版是给所有支持的语言使用的。

14:51:59:670    引发的异常:“System.InvalidCastException”(位于 Microsoft.Web.WebView2.Core.dll 中)
14:51:59:670    引发的异常:“System.NotImplementedException”(位于 Microsoft.Web.WebView2.Core.dll 中)

然而还是报错

在我电脑安装1.0.1905-pre版本后正常

更新到 -pre预览版

3.1 webView2新窗口,设置之后无法阻止打开新窗口

参考官方API:WebView2 功能和 API 概述 - Microsoft Edge Development | Microsoft Learn

其中CoreWebView2NewWindowRequestedEventArgs Class (Microsoft.Web.WebView2.Core) | Microsoft Learn  

CoreWebView2NewWindowRequestedEventArgs类的 Handled=true及e.NewWindow=打开新地址的控件,23年还能用,24年1月无法阻止开新窗口,就连之前开发好的程序也一样

private void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
        {
            e.Handled=true;
            var wv2Now = (sender as Microsoft.Web.WebView2.Wpf.WebView2);
            Console.WriteLine($"e{e}  sender{sender}  ");
            e.NewWindow = webView2.CoreWebView2; //(CoreWebView2)sender;

        }

解决方案:e.Handled=true; +e.NewWindow = webView2.CoreWebView2; 第一次新开窗口,第二次阻止了,也不再原来的窗口加载对应网址;e.NewWindow = webView2.CoreWebView2;注释掉,然后每次都阻止,之后可以用原来的窗口打开webView2.CoreWebView2.Navigate(e.Uri.ToString());

结论:e.NewWindow = webView2.CoreWebView2; 在24年1月这句是有BUG的,写在e.Handled=true; 之后第 及e.Handled=true; 注释掉都是 ,及BUG 完全不受e.Handled=true; 影响;   第一次能打开窗口,第一个新窗口关闭就不能再打开新的,

最新的改成

private void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
{
        e.Handled=true; 
        webView2.CoreWebView2.Navigate(e.Uri.ToString());

}

4. 新建类不自动加 public 等,

报错 错误 CS0052 可访问性不一致: 要手动加入;

在C#中,字段的可访问性修饰符决定了该字段可以在哪些地方访问。常见的修饰符有publicprivateprotected

5.   

保存下一句就显示报错,原理不理解,现象和解决已有

Console.WriteLine("1111111111111111111");
            outputImage.Save(outputImagePath, ImageFormat.Png);
            Console.WriteLine("111111111222222222222222222221");
            
            // 异步加载图像并显示
            pictureBox2.BeginInvoke(new Action(() =>
            {
                pictureBox2.Image = new Bitmap(outputImagePath);
                Console.WriteLine("33333333333");
            }));

输出的时间  1 和2 有间接, 2和3没有

Console.WriteLine("1111111111111111111");
            outputImage.Save(outputImagePath, ImageFormat.Png);
            Console.WriteLine("111111111222222222222222222221");
                Console.WriteLine("33333333333");
                pictureBox2.Image = new Bitmap(outputImagePath);
                // 异步加载图像并显示
            pictureBox2.BeginInvoke(new Action(() =>
            {
                pictureBox2.Image = new Bitmap(outputImagePath);
                Console.WriteLine("33333333333");
            }));

4次输出没有间隔, ????????

6. 数组不能存数组, 只能List 等

7.   句柄问题之缓存问题,

2024.01.09使用Process process2 = new Process();开启非子目录程序,句柄获取到后无法正常操作,只能在别的地方开启后按标题找句柄后正常操作,第二天C盘满了,缓存删除后重开项目,运行之前注释掉的 Process实例开启的代码可以正常操作unity程序窗口, 

8.  注释编码问题? 

注释中文有时不行,变成字母和数字可以

9. 地址解析问题 

"pack://application:,,,/assets/images/pause.png" 找不到图片,

 是因为图片属性 的 生成操作 选的其它,

1. 选 “无”的时候Environment.CurrentDirectory+"/assets/images/play.png"可找到,

2.选“资源”  Environment.CurrentDirectory+"/assets/images/play.png" 找不到图片,"pack://application:,,,/assets/images/pause.png"则可以

10. XAML样式与触发器 优先级问题

坑:

Background="Blue">
               
                   
               

           

原因:

这里 触发器 触发后无法改变背景色,Style里面的触发器 也无法改变Visibility="Visible"  Background="Blue" 等在外边设置,

 

1.类似

11.  命名空间“clr-namespace:xxx”中不存在“xxxasd”名称。

未解实例:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace Converter
{
    /**
    * 使用已有控件的已有依赖属性Tag 和自身的x:Name 属性做比较,返回 Visibility.Visible 或 Visibility.Collapsed
    
    

    
    

    然后
    
    


    另外,要Style="{StaticResource CanvasVisibilityStyle}"提供的样式更多,不能像H5的CSS一般弄多个,只能新建一个Style继承并扩展更多样式
     */
    public class NameToVisibilityConverter: IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string cAllTag = value?.ToString();
            string canvasName = parameter?.ToString();
            return cAllTag == canvasName ? Visibility.Visible : Visibility.Collapsed;

        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

引入  xmlns:con="clr-namespace:Converter"   和

报错

结果 各种调,N次后,多出一个 其它地方先冲突,解决冲突就正常了,莫名其妙的BUG, 莫名其妙地好了

有时报错,直接运行又没错了, 有时还报错,错误提示还是删掉的内容

12.  WIn32 API 兼容

framework 有个首选32位, 默认选中,要去掉才能使用64位的,或者代码 改写成兼容的也可以

13. 系统32位 和64位 转换后报错

转换后 有些代码报错,尝试重新生成,完成后正常了

14. opencvSharp4 库 的宽高 顺序问题

Mat mat_image=new  Mat(高,宽,样式);

而缩放时 Cv2.Resize(vc_image, resize_image, new OpenCvSharp.Size(宽, 高));

15.  报错但能运行 的坑

情况1: dll导入报错或其它报错,但能正常运行,未知原因

情况2: 代码报错,能运行,清理后无法生成,如果是报重复的,右键函数或类查看引用的,都是双份引用以上,很可能是代码备份,把备份的项目文件夹 排除出去。

坑 在于  没清理,重新生成,运行的是旧的,之前能运行的还能运行,报错是报错新的代码

16.  代码生效问题

修改一行代码,并在下一行输出,运行后输出的生效了,但数据不对,不是刚刚修改的,点进去看还是旧的,需要重新生成

17. 核显问题

核显时常是 GPU 0,  webview2控件无API 指定GPU(也许谷歌浏览器指令可以), 使用系统 的设置, 右键 显示设置 图形设置   增加程序,然后选定 高性能+对应 GPU

但出问题的那个主机还是不行,指定了,独显异常

18.The MICROSOFT VISUAL C++ 2015 -2022 RUNTlME library is missing,
please install it and try again.

问题1:  安装了x64为的环境还是报错

解决:发现是 debug 版本的exe 不能替换到 Release版本,一些库可能报错;改了对应的就可以了

19. System.Windows.Media.Imaging.BitmapImage   渲染不止显示那么大,而是显示原图大小,

如果显示的区域没有原图大,bitmapImage.DecodePixelWidth = displayWidth; 

内存下降很多,特别是序列帧图片,数量多又大的图

20. Dubug模式 和 Release模式差异问题

  1. 优化设置:Release 模式下,编译器会进行优化,可能会移除未使用的代码,包括调试输出。

  2. 输出流:在 Release 模式下,控制台输出可能无法直接显示,特别是在没有控制台窗口的应用程序中,如 WPF 应用。

  3. 使用调试工具:如果需要在 Release 模式中查看输出,可以使用调试工具,例如使用 Debug.WriteLine(),并在输出窗口查看信息。

  4. 配置文件:还可以在项目属性中调整输出设置,确保信息能够被捕获

(1)输出是差异,使用console.WriteLin() 不能再Release模式输出,被忽略的

(2)热加载(热重载),Release 模式下不改变,要么在未生成前使用使用xaml预览位置,要么改回debug模式

(3)之前的第18点,等等问题

21. app.xaml.cs不能console.WriteLin() 输出的问题,只能打断点知道执行到了,不方便调试

(1)用别的工具,

(2)或者把程序属性改成 控制台程序(只输出app.xaml.cs的)

(3)使用Debug.WriteLine("xxx");   或者 Trace.WriteLine("xxx t");

你可能感兴趣的:(c#,开发语言)