我需要引用一个有两个版本的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处理程序。有没有其他方法来实现建议的行为?
答案 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
。这只是猜测。