尝试一个不需要两个单独的x86和x64程序的解决方案.它使用Oracle的ODBC驱动程序。我有对Oracle.DataAccess.DLL的引用。但是,这个DLL根据系统是x64还是x86而不同。目前,我有两个独立的解决方案,我为两者维护代码。这太残忍了。我想知道什么是正确的解决方案?我的平台设置为“任何CPU”。而我的理解是,VS应该将DLL编译成中间语言,这样我使用x86或x64版本就没有关系了。但是,如果我尝试使用x64DLL,我会收到错误消息“无法加载文件或程序集‘Oracle.DataAccess,Version=2.102.3.2,Culture=neutral,PublicKeyToken=89b483f429c47342’或其依赖项之一。加载格式是不正确的程序。”我在32位机器上运行,所以错误消息是有道理的,但这让我想知道当我需要在x64上工作时如何有效地开发这个程序。谢谢。这纯粹是一个部署问题,您永远不必维护不同的项目。虽然这是一个尴尬的问题,并且因为没有自己处理它而在Oracle遭到嘘声。另一个考虑是这个组件确实应该在目标机器上使用。一些选项这是您的问题的有效解决方案:将2个DLL(x86和x64)添加到子文件夹中的解决方案。让他们“如果更新则复制”引用正确的DLL以从您添加的2个DLL进行开发调试。让它复制Local=false。这样做的目的是,当您的应用程序启动时,DLL不会自动加载。在您在该程序集中使用Type之前,它不会被加载。一旦发生这种情况,将在.Net中触发一个事件,询问它在哪里可以找到您的程序集。因此,在第一次使用程序集之前的某个时间,请确保将自己附加到事件中。AppDomain.CurrentDomain.AssemblyResolve+=CurrentDomain_AssemblyResolve;在处理程序的内容中,确保在请求时加载DLL(x86或x64)。静态System.Reflection.AssemblyCurrentDomain_AssemblyResolve(对象发送者,ResolveEventArgsargs){如果(args.Name.Equals(“MyFullAssemblyName”)){varpath=System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly()。地点);如果(IntPtr.Size>4){vardll=System.IO.Path.Combine(path,@"MySubDirMyDLL_x64.dll");返回System.Reflection.Assembly.LoadFile(dll);}else{vardll=System.IO.Path.Combine(path,@"MySubDirMyDLL.dll");返回System.Reflection.Assembly.LoadFile(dll);}}返回空值;瞧。您现在可以将应用程序作为32位和64位运行。或者在子文件夹中添加DLL,您可以将它们作为嵌入式资源,并像这样加载它们:varass=Assembly.GetExecutingAssembly();if(IntPtr.Size>4){varstrm=ass.GetManifestResourceStream("the.resource.name.for.MyDLL_x64.dll");vardata=newbyte[strm.Length];strm.Read(data,0,data.Length);返回程序集。加载(数据);}else{varstrm=ass.GetManifestResourceStream("the.resource.name.for.MyDLL.dll");vardata=newbyte[strm.Length];strm.Read(data,0,data.Length);返回程序集。加载(数据);}}返回空值;这不适用于所有程序集。一些“混合”程序集往往会失败,除非它们是从磁盘加载的(可以通过在加载前将它们写入磁盘来解决)。如果您在32位计算机上运行,??则必须加载32位版本的OracleDLL。32位程序不能引用64位DLL。此外,64位程序不能引用32位DLL。如果您有多个版本的外部DLL,“任何CPU”是正确的目标。诀窍是确保找到并加载正确的OracleDLL。最好的办法是在32位系统上找到64位版本的DLL并将其重命名,以便运行时无法找到它。如您所见,将AnyCPU与本机早期绑定一起使用是行不通的,因为您需要两个单独的解决方案和构建。您必须获得64位系统才能开发或至少测试x64编译的dll。但是,通过后期绑定,您可以使用AnyCPU和系统属性来确定您正在运行的体系结构并链接到正确的dll(如果保持命名为Oracle.DataAccess.x86.dll)。如果将它们安装到GAC中就更容易了,您甚至不必费心测试体系结构就可以绑定,但我相信您仍然会迟到绑定。请注意,如果您确实无法重新安装Windows,VMware可以在32位主机上运行64位来宾。您可以配置相同的解决方案来单独构建x86/x64版本。您可能还需要添加一个构建后步骤,将正确版本的DLL复制到相应的输出文件夹……至少如果您必须构建2个解决方案——使用相同的源(将文件添加为对第二个解决方案而不是复制到第二个解决方案)。以上就是C#学习教程:尽量不需要两个独立的x86和x64程序解决方案来分享所有内容。如果对你有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请右击联系管理员删除。如需转载请注明出处:
