System.Data.SQLite.dll不能编译成AnyCPU问题的解决方案,以及它跨x86和x64的使用方法。

        Data.SQLite.dll可以认为是对用C编写的sqlite3.c的.NET平台的封装,由于原sqlite3.dll是区分x86和x64发布的,Data.SQLite.dll一般也会区分x86和x64封装,结果可能会在实际使用时产生麻烦。

        从Data.SQLite.dll的源代码中可以知道,其解决方案中保含两部分的项目,一部分是C#项目,会被生成Data.SQLite.dll和Data.SQLite.Linq.dll;另一部分是C/C++项目,会被生成SQLite.Interop.dll。如果对源代码进行某些配置,结果会生成一个文件,即我们常用的Data.SQLite.dll,这可以从官方网站中的那些标着“bundle”字样的文件中可以看出,而没有这个字样的文件,其中会包含SQLite.Interop.dll。在这两个部分中,C#部分中的“UnsafeNativeMethods.cs”文件中定义了两个部分的关系,即在此文件中通过DllImport来导入SQLite.Interop.dll,而路径可以是当前目录下,或者当前目录的Win32、x86、x64等目录之下。这些就是Data.SQLite.dll的基本内部结构。

        Data.Sqlite.dll的源代码中使用了两种C/C++和C#的交互方式,都可以达到在.NET平台利用C/C++代码的目的。一种是以C#代码为主体,导入C/C++ dll的方式,这样会生成多个dll。另一种以C/C++代码为主体,导入C# module的方式,这样只会生成一个dll。

        由于解决方案中存在C/C++项目,这是不能够生成AnyCPU的,所以引用该dll的程序,如果必须要求生成在AnyCPU中的话,该dll的使用将会出现问题。至今发现的唯一一种解决方案是,把C#项目生成的Data.SQLite.dll、x64目录下的x64版本的SQLite.Interop.dll、x86目录下的x86版本的SQLite.Interop.dll组合在一起使用。使用时,只需要引用Data.SQLite.dll,它的内部会根据当前平台的不同而调用不同的SQLite.Interop.dll,从而达到对AnyCPU都兼容的目的。

        上面所说的方法可以达到跨x86和x64平台的目的,不过如果引用该dll的程序不必要一定在AnyCPU下生成,还有一个更方便的方法,把引用该dll的程序在x86下生成,dll只用已经发布了的32平台的版本即可。

        其它可能出现的问题,例如Debug下正常而Release下不正常、Console下正常而WinForm下不正常、Win32下正常而Win64下不正常等等,如果可以接受用不优化的Debug版本,或者不使用Winform形式的程序,或者只在一个平台下使用,就不必像我说的那样复杂,如果要求很严格,可以试试我在上面所说的方案。

        All Comments are Welcome.

posted on 2012-12-22 08:43  yao2yao4  阅读(8835)  评论(7编辑  收藏  举报

导航