根据工艺位数使用32位或64位特定dll

时间:2011-09-24 11:37:58

标签: asp.net assembly-resolution

我需要引用一个有两个版本的DLL(一个用于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处理程序。有没有其他方法来实现建议的行为?

2 个答案:

答案 0 :(得分:1)

从我的观点来看,最简单的方法但不太灵活,使用Condition在csproj文件中明确指定特定于平台的引用:

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

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

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

答案 1 :(得分:0)

answers for dealing with this for System.Data.SQLite

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