根据引用应用程序的位适当地加载x64或x86版本的程序集



我有两个程序集,它们都包含相同的命名空间和类。一个是32位的,名为assembly_x86.dll,另一个是64位的,名称为assembly_x64.dll。

我希望能够将包含的应用程序构建为AnyCPU,并使其在32位和64位操作系统上无错误运行。因此,我需要它在运行时根据包含进程的位动态选择正确的引用。我一直在研究这个问题有一段时间了,什么都没能想出。我觉得我可能错过了一些简单的东西。

我最近的尝试是添加对两个程序集的引用,连接AssemblyResolve事件,并尝试用32位替换64位引用,如果它无法像这样加载64位版本…

    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位机器上,我希望它能调用MyClass。32位程序集中的MyMethod,如果我部署到64位机器上,我希望它调用MyClass。64位程序集中的MyMethod。

如果这两个程序集都有相同的名称(以及版本、区域性、公钥令牌),我相信它可能会起作用并获得正确的版本。但是,由于程序集名称不同,因此没有。这就是我得出的结论,我需要在运行时交换引用。

您可以在安装过程中检查操作系统,然后根据操作系统只部署所需的DLL。用于SQL Server CE的ClickOnce引导程序也执行类似的操作。

相关内容

最新更新