缘起

很多时候,我们需要引用在不同平台下的DLL,32位(X86)和64位(X64)。如果平台错误,在C#中会引发BadImageFormatException异常。

解决思路

我们同时不能添加不同平台下的DLL,即使名称不一样(会报类型同时存在于两个DLL中)。能不能只在某种平台下引用,在其他平台下不引用呢?

VS工程的配置都保存在配置文件(.csproj)中。在VS中,找到相应的项目,右键选择卸载项目,完成后项目变为灰色。然后在项目上单击右键,选中编辑(项目名称).csproj。这们我们就可以查看VS工程文件。如下图:

在其中,我们发现有Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "。猜想$(Platform)是具体的平台,包括AnyCPU、X86、X64。Condition表示条件。我们通过修改Debug和Release情况下的配置可以验证这一点(在工程的属性->生成标签页中可修改)。

再往下查看工程文件,我们发现有:

这正是我们在VS工程中所引用的DLL,那我们试试在其中能否设置Condition,答案是可以,

那么我们尝试着在不同平台上添加不同的条件,如下图:

经过验证,我们发现,成功了……

在64位情况下,在32位情况下

扩展

Condition除了可以用==以外,还可以用!=,<, >, <=, >=等关系操作符,!,And,Or等逻辑操作符,详见MSBuild Conditions

VS工程文件中包含Properties(定义于PropertyGroup中) 和ItemGroups (定义在ItemGroup中)两种类型的变量。$(PropertyName) 可引用所有定义在PropertyGroup中的变量,详见MSBuild的简单介绍与使用

在VS工程文件中最下面还有一行注释了的代码,这就是著名的生成前和生成后事件

关于MSBuild的更多知识,感兴趣的可以查看MSDN相关文档。

平台和平台目标

平台是指在配置管理器中定义的平台(位于生成菜单下),对应于Platform

平台目标是指在项目生成属性中设置的目标平台,对应于PlatformTarget

在C++中的应用

在C++中未测试过,原则上应该可以,下图是在C++中添加一个库目录后工程文件中添加的条目。

最新文章

  1. 在Ubuntu和Linux Mint上安装Oracle JDK
  2. 【类库】私房干货.Net数据层方法的封装
  3. Java反射机制(取得类的结构)
  4. SQL Server 2008安装和配置过程
  5. C++之构造函数重载
  6. 学习笔记:GLSL Core Tutorial – Pipeline (OpenGL 3.2 – OpenGL 4.2)
  7. ClientURL库-curl_setopt()
  8. java.lang.UnsatisfiedLinkError:dlopen failed: “**/*/arm/*.so” has unexpected e_machine: 3
  9. 迅为6818开发板-Cortex-A5架构丨支持4G全网通丨GPS丨WIFI丨另有丰富的扩展模块
  10. (转载)dotnet core 中文乱码 codepages
  11. python多版本管理包pyenv
  12. 用tmux工具给linux命令行分栏
  13. MongoDB的增、删、改、查操作(五)
  14. yarn的学习-2-从 npm 迁移到 yarn-包管理工具
  15. 一个简单的代码生成器(T4文本模板运用)
  16. Linux kernel 有关 spi 设备树参数解析
  17. Java命令使用 jmap,jps,jstack,jstat,jhat,jinfo
  18. [JVM] - 继10进制的java.lang.Object查看之后
  19. Spring4笔记12--SSH整合3--Spring与Struts2整合
  20. SQL 之连接查询

热门文章

  1. 安装yum仓库
  2. 【Linux】CentOS7上解压zip需要安装uzip
  3. django 保存订单乐观锁的使用
  4. 【CF453D】 Little Pony and Elements of Harmony(FWT)
  5. Django 允许其他可以访问的设置
  6. Eclipse Java SE升级Java EE
  7. PowerBuilder中新建PBL
  8. [BZOJ 5158][Tjoi2014]Alice and Bob
  9. 标准结构篇:2)O型橡胶密封圈
  10. sklearn的train_test_split