使用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。这只是一个猜测。

+0

看起来没有更好的方法。不管怎么说,还是要谢谢你。 – ollifant

最直接的方法,但是从我的角度来看不够灵活被明确指定使用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

+0

在项目文件中使用条件仅在构建时有所区别。因此,仍然需要重新分配两个不同的版本。 – ollifant

+0

Assembly.Load解决方案可以工作,但这需要我使用大量的反射。或者,也许动态也可以.. – ollifant

+0

@ollifant:.NET框架支持两种组装解决方法 - 通过静态或动态引用。动态引用 - Assembly.Load()/ etc,static - 通过项目文件引用程序集或通过元数据作为其他引用的依赖关系。有一件事你也可以看看'发布者策略文件'功能和命令行参数'/ platform:processorArchitecture' – sll