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

时间:2011-05-27 04:29:16

标签: .net assemblies x86 64-bit assemblyresolve

我有两个程序集都包含相同的命名空间和类。一个是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位机器,我希望它在32位程序集中调用MyClass.MyMethod,如果我部署到64位机器,我希望它在64位程序集中调用MyClass.MyMethod。

如果程序集都具有相同的名称(以及版本,文化,publickeytoken),我相信它可能正常工作并选择正确的版本。但是,由于程序集名称不同,因此不会。所以这就是我得出的结论,我需要在运行时交换引用。

1 个答案:

答案 0 :(得分:1)

您可以在安装过程中检查操作系统,然后仅部署基于操作系统的所需DLL。 SQL Server CE的ClickOnce引导程序也做了类似的事情。