使用32位或64位特定的DLL取决于进程位
问题描述:
我需要引用一个DLL有2个版本(一个用于32位和一个用于64位)。 我的目标是构建一个适用于32位和64位系统的Web应用程序。使用32位或64位特定的DLL取决于进程位
我想到了默认引用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处理程序将不叫。有没有其他方法可以实现建议的行为?
答
见answers for dealing with this for System.Data.SQLite。
我认为你提出的方法应该可以工作,但是你需要移动32位版本,所以默认情况下不能找到它,所以_AssemblyResolve
总是要求该DLL。这只是一个猜测。
答
最直接的方法,但是从我的角度来看不够灵活被明确指定使用Condition
中的csproj文件平台的具体引用:
<ItemGroup Condition=" '$(Platform)' == 'x86' ">
<Reference Include="MyAssemblyx86">
您也可以使用动态Assembly.Load(AssemblyName)方法重载做到这一点。 参数是AssemblyName类型的暴露可能被设置为无财产AssemblyName.ProcessorArchitecture的,MSIL,X86,X64,IA64,AMD64
一个你也可以考虑的事情是Publisher Policy File
功能和命令行参数/platform:processorArchitecture
看起来没有更好的方法。不管怎么说,还是要谢谢你。 – ollifant