根据引用应用程序的位数加载相应的x64或x86版本的程序集

4
我有两个包含相同命名空间和类的程序集。一个是32位的,名为assembly_x86.dll,另一个是64位的,名为assembly_x64.dll。
我希望能够将包含应用程序构建为AnyCPU,并在32位和64位操作系统上都能够无误运行。因此,我需要在运行时根据所包含进程的位数动态选择正确的引用。我已经花费了一些时间来尝试解决这个问题,但一直没有找到解决方法。我觉得可能是我漏掉了一些简单的东西。
我的最新尝试是添加对两个程序集的引用,连接AssemblyResolve事件,并尝试在无法加载64位版本时替换64位引用为32位引用,如下所示...
    static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        Assembly assembly = null;

        if (args.Name.Contains("assembly_x64"))
        {
                assembly = typeof(x86_alias::TypeName).Assembly;
        }

        return assembly;
    }

这将导致以下异常:The located assembly's manifest definition does not match the assembly reference.。非常感谢任何有用的提示。关于下面的一些评论,我认为我描述我的目标可能做得不好。让我详细说明一下。例如,如果这些程序集中只有一个方法我想要调用 - MyClass.MyMethod。如果我只使用对32位程序集的引用构建应用程序并在32位机器上安装它,那么它就可以正常工作。同样,如果我使用对64位程序集的引用构建它并在64位机器上安装它,一切都很好。但是,我的目标是不必拥有两个独立的应用程序构建。如果我部署到32位机器上,我希望它调用32位程序集中的MyClass.MyMethod,如果我部署到64位机器上,我希望它调用64位程序集中的MyClass.MyMethod。如果这些程序集都具有相同的名称(和版本、文化、公钥令牌),我认为它可能会起作用并选择正确的版本。然而,由于程序集名称不同,它不起作用。因此,这就是我得出需要在运行时交换引用的结论的方式。

还没有答案吗? - nietras
1个回答

0

你可以在安装过程中对操作系统进行检查,然后根据操作系统仅部署所需的DLL。SQL Server CE的ClickOnce引导程序也是类似的做法。


除非我误解了你的建议,否则我认为这并没有帮助。部署正确的dll不是问题所在。上述错误是在32位操作系统上运行应用程序时出现的,而32位版本的程序集存在于其中。 - Chris
@chris 这意味着问题不是你所描述的。为什么要担心64位,当你甚至无法让纯32位解决方案工作呢? - David Heffernan
我的理解是该应用程序编译为AnyCPU,但依赖于一个具有特定32位和64位版本的DLL。如果您只部署32位DLL并在32位操作系统上运行,则不会出现问题,同样适用于64位操作系统。在运行时无需尝试替换任何内容。 - CodeMan
抱歉,它不允许我完整地输入我的评论。因此,我在原帖中更详细地阐述了我的目标。如果您不介意的话,请看一下,再次感谢您的时间。 - Chris
在我看来,部署时间切换非常令人讨厌(除非它是一个与操作系统深度集成的程序)。 - CodesInChaos
烦人的意味着你以前成功完成过这件事吗?如果是这样,你介意分享一下如何做到的吗? - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接