C# 调用 dll 出现 The parameter is incorrect 错误

C# 调用 dll 出现 The parameter is incorrect 错误 我遇到的情况是,因为调用的 dll 方法,会接受包含特殊字符的参数,所以在方法的声明部分添加了 CharSet = CharSet.Auto,但是添加后,调用方法时就出现了 “ The parameter is incorrect ” 错误 经过检查,时因为其中一个参数为 int 类型,数值为 260,原本正常的程序,在添加了 CharSet 后就报错,提示 “The parameter is incorrect” (参数不正确),后面把数值改为 0,程序就允许正常了。 如果你遇到的也是这种情况,原来方法运行正常,但是修改了 DllImport 中的 CharSet 后反而报错,那么你就需要去逐一检查和测试,你传递的参数 真正的原因,我目前还没有找到,不过我猜测可能是因为不同 CharSet 对应的类型的字节不一样导致的问题 相关阅读: C++与C#数据类型对应关系总结 调用 dll 出现 The system cannot find the file specified 错误

调用 dll 出现 The system cannot find the file specified 错误

C# 中, 调用 dll 出现 The system cannot find the file specified 错误 最近在测试,使用的是 Hebrew 希伯来语的 Windows 10 系统,测试 C# 调用 newdev.dll 中的 UpdateDriverForPlugAndPlayDevices() 去安装驱动,该方法的声明如下: 在英文版的系统中测试正常,但是在 Hebrew 语的系统就报错,提示 “The system cannot find the file specified”,系统无法找到指定文件 但是传递的驱动文件是确切存在的,不过因为存放驱动的目录在用户目录下,我就思考是否因为路径的问题,因为路径包含 Hebrew 语的字符,导致 UpdateDriverForPlugAndPlayDevices() 无法识别文件路径,所以才提示无法找到指定文件 查找资料,发现 C# 在调用 dll 的方法时,确实可以指定字符集,见:Specifying a Character Set 然后我把 UpdateDriverForPlugAndPlayDevices() 方法的声明改为: 在 DllImport 中添加了 CharSet […]

C# 判断程序是否以管理员身份运行

C# 判断程序是否以管理员身份运行, C# 编写的桌面程序,有些操作是需要进行提权的,如下: 而在代码中可以通过 以下代码来识别软件是否已提权 参考: C# Check if run as administrator [duplicate] 推荐阅读: Run as administrator C# How do I force my .NET application to run as administrator? Visual Studio 查看当前程序所有线程

获取指定目录下的子目录

根据不同的需求选择不同的方法 获取指定目录下的子目录操作类有两个选择: Directory : 静态类,对文件夹的操作单一时选择; DirectoryInfo :动态类,对文件夹有多种不同操作时选择; 方法也有两种选择: GetDirectories() :需要等所有子目录都准备好才能进行操作,返回结果为数组类型,一般子目录数量不大时使用; EnumerateDirectories() :.net 4.0 后增加,更高效,无需等待子目录准备好就可以进行操作,返回结果为 IEnumerate<T> 类型,子目录数量巨大时优先使用; 注意:Directory 调用方法时,关键类型是 string;DirectoryInfo 则是 DirectoryInfo 类型; 上述两个方法都有 3 个重载,分别是: 返回当前目录下所有子目录 (默认,不处理子目录); 按通配符返回自定目录 (只支持 * 和 ?); 按通配符返回所有子目录 (所有层级) 获取指定目录下的子目录 测试目录结构: 处理代码: 结果: 默认只会返回 test 当前目录下的子目录: 返回当前目录下的包含 ”test“ 的目录: 返回所有层级包含 ”test“ 的目录: 返回所有子目录: 关于获取文件部分,请参考:C# 获取指定目录下的文件

C# 获取指定目录下的文件

使用到的类 DirectoryInfo 和 Directory,后者提供静态方法,可以直接使用; 对同一文件有多种操作时,可以使用 DirectoryInfo; 对文件的操作单一时,就是用 Directory 默认方式获取目录下的所有文件 C# 获取指定目录下的文件 使用 GetFiles() 方法,默认只返回当前目录下的文件,不处理子文件夹,该方法有三种重载: GetFiles() 不带参数,按默认返回 GetFiles(string pattern) 使用通配符返回指定文件,该模式只支持 * 和 ?作为通配符,不支持正则表达式(* 表示匹配多个字符,? 表示匹配一个字符) GetFiles(string pattern, SearchOptions option) 也支持通配符,SearchOptions 选择 AllDirectories 时,会返回子目录下的文件 注意: DirectoryInfo 返回的结果是 FileInfo 类型的数组; Directory 返回的结果则是 string 类型的数组 SearchOptions 类型 源代码如下: 枚举类型,控制只处理当前目录,还是会一并处理子目录 测试目录: D:\test\ 目录下 Directory 例子 默认返回当前目录所有文件 输出 files 结果为: 根据通配符返回结果: […]

Visual Studio 查看当前程序所有线程

查看当前所有线程 在程序中打断点,然后启动调试(注意:线程窗口需要启动调试才可以看得到)点击 Debug > Windows > Threads 线程窗口如下:

LINQ 查询

基本信息 LINQ (Language Integrated Query) : 语言集成查询,它运行代码以查询数据库相同的方式操作内存中的数据;注意:LINQ 读作 lin k,而不是 lin q 基本语法格式 例子: 注意:一般是以 from 开头,以 select 结束,使用 LINQ 可以减少使用 for 循环,更方便的获取集合数据中的特定数据。 排序 orderby 倒序排序:关键字是 orderby (不分开) 分组 group by 分组则有所不同,格式为:group 变量 by 条件 注意:into 后面的临时变量 g 内包含多种属性和方法,其中用的较多的有:g.Key 分组时 by 所用的条件,如上例中为 name;g.Max() 用于求分组后组中的最大值,用法 g.Max(x=>x.age);g.Min() 用于求分组后组中的最小值; 按名字排序,找出年龄最大 也可以根据需要定义返回格式:new {g.Key, n1=v1, n2=v2…} 根据多个条件来分组:new {condition1, condition2}根据年龄和名字分组, 再找出 […]

Windows 下获取硬盘序列号

只获取序列号 以下任意一条命令都可以: wmic diskdrive get serialnumber wmic path win32_physicalmedia get SerialNumber wmic path Win32_DiskDrive get SerialNumber 注意:windows 7 下获取的序列号格式可能和 Windows 10 下的不一样 获取硬盘的更多信息 wmic diskdrive get Name, Manufacturer, Model, InterfaceType, MediaType, SerialNumber 相关的字段(属性)可以查看微软官方文档 C# 中获取硬盘信息的代码 需要引用 System.Management 库 参考 Find Hard Disk Serial Number in Windows 10

判断程序是否以管理员的身份打开

代码如下: public static Boolean IsAdministrator() { System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent(); System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity); return principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator); }

WPF 的 KeyDown 事件不生效

出发键盘按钮事件 控件当前获得焦点,通过 xaml 的 FocusManager 或者后台使用 Focus() 方法来设置 将控件的 Focusable 设为 True,如下: 代码示例如下: 界面: <Grid FocusManager.FocusedElement=”{Binding ElementName=tb}”> <TextBlock Focusable=”True” KeyDown=”TextBlock_KeyDown” x:Name=”tb” Text=”abc” FontSize=”100″/> </Grid> 后台: private void TextBlock_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { tb.Text = “ok”; } }