using (var target = new GDI.Bitmap(path))
        {
            var buffer = target.LockBits(
                new GDI.Rectangle(0, 0, target.Width, target.Height),
                GDI.Imaging.ImageLockMode.ReadOnly,
                GDI.Imaging.PixelFormat.Format32bppArgb);

            try
            {
                var bitmapSource = BitmapSource.Create(
                    buffer.Width, buffer.Height,
                    96, 96, PixelFormats.Bgra32, null,
                    buffer.Scan0, buffer.Stride * buffer.Height, buffer.Stride);

                return bitmapSource;
            }
            finally
            {
                target.UnlockBits(buffer);
            }
        }

在项目中做一个批量读取bin目录下的所有DLL动态装在到Ioc容器的功能,读取方法使用的 Assembly.LoadFrom(path); 常规情况下使用是没有问题的,但是如果程序依赖的某一个库本身还需要依赖非dotnet生成的非托管DLL,如sqlite的依赖库,使用这个方法就会报错,此为背景。
要解决这个问题最开始想到的方案是直接try catch 包围 Assembly.LoadFrom 语句块,报错时不加载;但是略显暴力,后经过观察发现dotnet生成的动态链接库文件的文件头部分似乎都有一个公共标记
2024-01-03T06:04:01.png

第61个字节是 0x80,第62个字节是 0x00,通过以下方法可以判断一个DLL是否是dotnet生成的DLL:

using (var stream = File.OpenRead(file))
{
    stream.Seek(60, SeekOrigin.Begin);
    stream.Read(buffer, 0, 2);
}
if (buffer[0] == 0x80 && buffer[1] == 0x00)
{
    // 托管DLL;
}

遇到一个这样的面试问题,写一个方法可以针对数字类型进行冒泡排序。

直接手写代码开撸

void NumberSort<T>(T[] items) {  
    var temp = default(T);
    for (var i = 0; i < items.Length; i++) {
        for (var j = 0; j < items.Length && j != i; j++) {
        if (items[i] >  items[j])
            continue;  
        temp = items[i];
        items[i] = items[j];
        items[j] = temp;
        } 
    }
}

看似没毛病,结果发现没法编译,因为 items[i] 和 items[j] 没法执行比较。

F12 看一下 int、float、decimal等类型的的定义,发现他们都继承于 IComparable,顾名思义" 可比较的";

接下来修改代码

void NumberSort<T>(T[] items) Where T : IComparable {
    var temp = default(T);
    for (var i = 0; i < items.Length; i++) {
        for (var j = 0; j < items.Length && j != i; j++) {
            if (items[i].CompareTo(items[j]) > 0)
                continue;
            temp = items[i];
            items[i] = items[j];
            items[j] = temp;
        }
    }
}

完美运行