关于C#中使用SQLite自适应Any CPU程序的说明

在C#中如果要使程序自适应32位和64位系统,只需要将项目的“目标平台”设置为“Any CPU”就行了,但是如果程序中使用了SQLite组件,则需要对该组件额外进行一些简单的设置:

一、下载System.Data.SQLite组件:
从官网(http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki)中下载对应.NET版本的System.Data.SQLite二进制包,由于要自适应32位和64位系统,我们需要分别下载32位和64位的非静态连接二进制包:
csharp-sqlite-any-cpu-1

二、引用System.Data.SQLite.dll:
在C#程序中引用组件“System.Data.SQLite.dll”,比对下载的这两个二进制包,我们会发现除了SQLite.Interop组件外,其他文件是一样的,所以我们可以自由选择32位或64位的System.Data.SQLite.dll文件:
csharp-sqlite-any-cpu-2

三、引用SQLite.Interop.dll:
在程序生成目录里新建x86和x64两个子文件夹,分别将下载的对应平台的SQLite.Interop.dll复制到x86和x64文件夹中,由System.Data.SQLite.dll根据系统类型自动调用。为了方便管理,我们可以在项目中创建这两个文件夹,并设置SQLite.Interop.dll文件的属性为“如果较新则复制”,生成操作为“无”,从而使程序在生成的时候自动复制SQLite.Interop.dll文件:
csharp-sqlite-any-cpu-3

四、编译生成程序:
完成以上步骤后对程序进行编译生成,程序中使用的SQLite组件就能自适应32位和64位系统了。

关于C#中反射调用泛型方法的说明

在C#中通过反射的方式调用定义为泛型的方法时,我们需要先根据方法名称获取方法描写对象“MethodInfo”,然后通过
该对象的“MakeGenericMethod”方法构造出对应实际泛型类型的泛型方法,从而才能被我们使用:

// 定义的泛型方法结构
public void Test<T>();

// 获取当前类型
Type type = this.GetType();
// 获取Test的方法对象
MethodInfo methodInfo = type.GetMethod("Test");
// 定义泛型类型
Type genericType = typeof(int);
// 获取对应泛型类型的泛型方法
methodInfo = methodInfo.MakeGenericMethod(genericType);
// 反射调用泛型方法
methodInfo.Invoke(this, null);

关于C#中获取可空泛型类型Nullable中的基础类型的说明

在C#中可以使用在值类型后加问号(如“int?”)的方式定义可空的类型,该定义出来的类型实际是一个“Nullable<T>”的泛型类型。但是在对该类型数据进行强制转换等操作时会因为数据类型不匹配等原因无法转换,这个时候我们就需要取出该可空类型的实际基础类型:

// 定义可空泛型值类型
Type type = typeof(int?);
// 判断目标type是否是可空的泛型类型
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
    // 取出可空泛型类型中的基础类型
    type = Nullable.GetUnderlyingType(type);
}
// 返回基础值类型:int
return type;