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