首页 > 解决方案 > 在 Visual Studio 项目中混合项目平台目标

问题描述

尽管在线阅读了许多文章,但我仍然对哪些平台目标程序集可以相互混合感到困惑。

为了测试这一点,我创建了一个包含三个控制台应用程序项目和三个 .Net Framework 类库的 Visual Studio 解决方案。

控制台应用程序项目是 AnyCPUApp、X86App 和 X64App,并在配置管理器和项目属性 > 构建中设置了相应的平台目标。库项目是 AnyCPULib、X86Lib 和 X64Lib,并在配置管理器和项目属性 > 构建中设置了相应的平台目标。

X86App 将使用 AnyCPULib 和 X86Lib 构建和运行。当 X86App 引用 X64Lib 时,编译器会给出“处理器架构不匹配”警告,如果您尝试运行它,它会因 System.badImageFormatException 而崩溃。

X64App 将使用 AnyCPULib 和 X64Lib 构建和运行。当 X64App 引用 X86Lib 时,编译器会给出“处理器架构不匹配”警告,如果您尝试运行它,它会因 System.badImageFormatException 而崩溃。

我的问题:

  1. 为什么 AnyCPUApp 针对 X86Lib 运行(带有“处理器架构不匹配”警告),而不针对 X64Lib?
  2. 是否存在处理器架构不匹配会导致运行时故障的实际情况?
  3. AnyCPU 仅适用于类库吗?

我的 xxxApp 代码看起来像(将 xxx 更改为 AnyCPU|X86|X64,取消注释子句以测试和更新项目引用:

    namespace xxxApp {
    class Program {
        static void Main(string[] args) {
            //var anyCPULib = new AnyCPULib.AnyCPULib();
            //Console.WriteLine(anyCPULib.Hello);
            //System.Diagnostics.Debug.WriteLine(anyCPULib.Hello);

            //var x86Lib = new X86Lib.X86Lib();
            //Console.WriteLine(x86Lib.Hello);
            //System.Diagnostics.Debug.WriteLine(x86Lib.Hello);

            //var x64Lib = new X64Lib.X64Lib();
            //Console.WriteLine(x64Lib.Hello);
            //System.Diagnostics.Debug.WriteLine(x64Lib.Hello);
        }
    }
}

我的 xxxLib 代码看起来像(将 xxx 更改为 AnyCPU|X86|X64)

namespace AnyCPULib
{
    public class AnyCPULib
    {
        public string Hello { get { return "Hello from AnyCPULib"; } }
    }
}

我正在使用 Visual Studio 2019 版本 16.8.0 和 .NET Framework 4.8

标签: c#visual-studiocsprojtarget-platform

解决方案


推荐阅读