(精华)2020年9月10日 C#基础知识点 调用动态链接库DLL(调用系统Api和其他语言编写的DLL)

public partial class Program
    {
        static void FileMethod()
        {
            //var fs = new FileOpen("d:\\data.txt");//自定义调用
            var fs = File.Open("data.txt", FileMode.OpenOrCreate);//系统调用
            var bytes = new byte[fs.Length];
            var count = (int)fs.Length;
            var offset = 0;
            while (count > 0)
            {
                var n = fs.Read(bytes, offset, count);
                if (n == 0)
                    break;
                offset += n;
                count -= n;
            }
        }
    }

    public class FileOpen
    {
        public const uint GENERIC_READ = 0x80000000;
        public const uint GENERIC_WRITE = 0x40000000;
        public const uint CREATE_NEW = 1;
        public const uint CREATE_ALWAYS = 2;
        public const uint OPEN_EXISTING = 3;

        // 使用interop调用CreateFile函数有关CreateFile的详细信息请参阅非托管MSDN参考库
        // DllImport调用动态链接库自动寻找windowsAPI kernel32.dll库包含内存管理等
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
            uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
            uint dwFlagsAndAttributes, IntPtr hTemplateFile);

        private SafeFileHandle _handleValue;

        public FileOpen(string path)
        {
            Load(path);
        }

        public void Load(string path)
        {
            if (string.IsNullOrEmpty(path))
            {
                throw new ArgumentNullException(nameof(path));
            }

            _handleValue = CreateFile(path, GENERIC_WRITE, 0, IntPtr.Zero, CREATE_ALWAYS, 0, IntPtr.Zero);

            if (_handleValue.IsInvalid)
            {
                Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚公搬代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值