4

我有两个程序集都包含相同的命名空间和类。一个是 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),我相信它可能会正常工作并选择正确的版本。但是,由于程序集名称不同,因此不会。所以这就是我得出的结论,即我需要在运行时换出引用。

4

1 回答 1

0

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

于 2011-05-27T04:55:19.443 回答