当前位置: 首页 > 编程语言 > C#

加载x86或x64程序集分享

时间:2023-04-10 12:08:14 C#

加载x86或x64程序集我有两个版本的System.Data.SQLite.DLL——分别用于x86和x64平台。x86版本保留在应用程序文件夹中,x64版本保留在appFolderx64文件夹中。该应用程序是为AnyCPU编译的。如何根据Windows平台加载所需版本的SQLite?如果您使用来自http://system.data.sqlite.org的SQLite,System.Data.SQLite.DLL是完全托管的。有一个底层本机DLL,SQLite.Interop.DLL,需要根据进程(32位或64位)进行更改。我在“.NativeX64”中将本机库部署为64位,将“.NativeX86”部署为32位。在运行时,P/InvokeSetDllDirectory将DLL加载目录设置为指向进程的正确路径。http://msdn.microsoft.com/en-us/library/ms686203(v=vs.85).aspx(请注意,我不熟悉http://sqlite.phxsoftware上的遗留System.Data.SQLite.com.DLL版本架构)privatestaticclassNativeMethods{[DllImport("kernel32.dll",CallingConvention=CallingConvention.Cdecl)]internalstaticexternboolSetDllDirectory(stringpathName);}...//底层SQLite库是原生的。//根据进程手动设置DLL加载路径。varpath=Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),"Native");if(IntPtr.Size==8)//或:if(Environment.Is64BitProcess)//.NET4.0{path=Path.Combine(path,"X64");}else{//X32path=Path.Combine(path,"X86");}NativeMethods.SetDllDirectory(路径);一些antivir程序块SetDllDirectory()-我花了很长时间才意识到这一点。我们正在使用System.Reflection.Assemblymyass=System.Reflection.Assembly.GetExecutingAssembly();FileInfofi=newFileInfo(myass.Location);System.IntPtrmoduleHandle=LoadLibraryEx(fi.Directory.FullName+"\x64\SQLite.Interop.DLL",IntPtr.Zero,0);使用显式路径加载x64DLL。它在此时加载,.NET运行时将使用内存中的DLL而不是在磁盘上搜索它。版本1.0.80.0及更高版本对此有内置支持。如果开发机器和客户端机器可能具有不同的处理器体系结构,则可能需要多个二进制包。对于这种情况,强烈建议使用原生库预加载功能。它从1.0.80.0版本开始可用,默认情况下启用。(来自下载页面)但是,为了让它在我自己的插件中工作,我还必须在第一次引用SQLite之前添加://MakeSQLitework...(从例如x64/SQLite.Interop加载dll。dll)System.Environment.SetEnvironmentVariable("PreLoadSQLite_BaseDirectory",System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));Sql.Data.SQLite...看到这个问题:NewSQLiteMixingassemblies我很惊讶这完全有效。它应该首先找到x86版本并失败。失败的程序集绑定不会通过AssemblyResolve生成??另一次尝试。显然CLR实际上找不到x86版本,否则它在x64模式下也会失败。换句话说,当您修复问题时,您会破坏64位代码。首先解决x86问题,使用Fuslogvw.exe查看正在探测哪些文件夹中的程序集。真正的修复应该包括将x86程序集移动到一个单独的文件夹中并相应地调整事件处理程序。您可以测试IntPtr.Size以确定您是否在64位模式下运行(size==8)。还要确保生成完整路径名,如果应用程序的工作目录未设置在您期望的位置,则像现在这样使用相对路径将会失败。集会。获取入口程序集()。Location为您提供EXE的路径。您可以使用Environment.Is64BitProcess将进程标识为64位。(我会尽量避免捕获异常作为流程控制。)您不能将SQLite的源代码用作解决方案中的单独项目而不是预编译程序集吗?有了AnyCPU,一切都由系统自己处理,你不必在代码中去做...以上就是C#学习教程:加载x86或x64汇编教程,希望大家关注-安装合适的GAC中的DLL(例如64位平台上的64位版本)在Web/应用程序配置中使用程序集绑定(可能在机器配置中)完全限定Web/应用程序配置中的任何部分程序集引用。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: