6

我需要引用一个 DLL,它有 2 个版本(一个用于 32 位,一个用于 64 位)。我的目标是构建一个适用于 32 位和 64 位系统的 Web 应用程序。

我考虑过默认引用32位程序集并使用AssemblyResolve事件加载64位版本(如果加载32位版本失败):

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += _AssemblyResolve;
    // Try LoadAssembly ...
}

static System.Reflection.Assembly _AssemblyResolve(object sender, ResolveEventArgs args)
{
    var path = string.Format(@"...\lib_x64\{0}.dll", args.Name);
    return Assembly.LoadFrom(path);
}

但即使发生 BadImageFormatException,也不会调用 _AssemblyResolve 处理程序。有没有其他方法可以实现建议的行为?

4

2 回答 2

1

从我的角度来看,最直接但不太灵活的方法是在 csproj 文件中明确指定特定于平台的引用,使用Condition

<ItemGroup Condition=" '$(Platform)' == 'x86' ">
    <Reference Include="MyAssemblyx86">

您也可以使用Assembly.Load(AssemblyName)方法重载动态地执行此操作。参数是AssemblyName类型,它公开了可以设置为 None、MSIL、X86、X64、IA64、AMD64的属性AssemblyName.ProcessorArchitecture

您还可以研究的一件事是Publisher Policy File功能和命令行参数/platform:processorArchitecture

于 2011-09-24T11:53:28.023 回答
0

请参阅System.Data.SQLite 处理此问题的答案

我认为您提出的方法应该可行,但您需要移动 32 位版本,因此默认情况下无法找到它,因此_AssemblyResolve始终调用该 dll。这只是一个猜测。

于 2013-01-04T14:17:09.250 回答