我有两个程序集都包含相同的命名空间和类。一个是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),我相信它可能正常工作并选择正确的版本。但是,由于程序集名称不同,因此不会。所以这就是我得出的结论,我需要在运行时交换引用。
答案 0 :(得分:1)
您可以在安装过程中检查操作系统,然后仅部署基于操作系统的所需DLL。 SQL Server CE的ClickOnce引导程序也做了类似的事情。