【问题标题】:Using a 32bit- or 64bit specific dll depending on the process bitness根据进程位数使用 32 位或 64 位特定 dll
【发布时间】:2013-01-04 22:17:09
【问题描述】:

我需要引用一个 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 处理程序也不会被调用。有没有其他方法可以实现建议的行为?

【问题讨论】:

    标签: asp.net assembly-resolution


    【解决方案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

    【讨论】:

    • 在项目文件中使用条件只会在构建时进行区分。因此,仍然需要重新分发 2 个不同的版本。
    • Assembly.Load 解决方案可以工作,但这需要我使用大量反射。或者也许动态也可以..
    • @ollifant:.NET Framework 支持两种程序集解析方式 - 通过静态或动态引用。动态引用 - Assembly.Load()/etc,静态 - 通过项目文件引用程序集或通过元数据作为其他引用的依赖项。您还可以查看Publisher Policy File 功能和命令行参数/platform:processorArchitecture
    【解决方案2】:

    answers for dealing with this for System.Data.SQLite

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

    【讨论】:

    • 看来没有更好的办法了。还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2018-05-29
    • 2012-01-29
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多