缘起

很多时候,我们需要引用在不同平台下的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++中添加一个库目录后工程文件中添加的条目。

C#在不同平台下DLL的引用问题的更多相关文章

  1. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  2. 【VS开发】Windows平台下Makefile学习笔记

    作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开 ...

  3. 未能添加对***.dll的引用 问题解决方法

    这个不是什么新问题了,这里说一下我遇到的这个操蛋事. 转载请注明出处 http://www.cnblogs.com/zaiyuzhong/p/6236263.html 我做的和往常一样,找到SDK开发 ...

  4. Windows平台下Git服务器搭建

    第一步:下载Java,下载地址:http://www.java.com/zh_CN/ 第二步:安装Java.安装步骤不再详述. 第三步:配置Java环境变量. 右键”计算机” => ”属性” = ...

  5. Windows平台下PHP开发环境的配置

    Windows平台下PHP开发环境的配置 一.基本环境 1.Windows XP 32位 2.Apache 2.2.25,下载地址:http://mirror.bit.edu.cn/apache/ht ...

  6. .NET平台下,关于数据持久层框架

    在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...

  7. windows平台下VLC2.0.5编译

    windows平台下VLC2.0.5编译说明 时隔一年多,又要搞流媒体了,不过这次是要做流媒体服务器. 暂时决定使用vlc+ffmpeg+live555,虽然听有些前辈说这个组合的性能较差,只能作为学 ...

  8. 【MongoDB】在windows平台下mongodb的分片集群(五)

    本篇接着上面的四篇继续讲述在window平台下mongodb的分片集群搭建. 在分片集群中也照样能够创建索引,创建索引的方式与在单独数据库中创建索引的方式一样.因此这不再多说.本篇主要聚焦在分片键的选 ...

  9. NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别

    NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别 1. Interop含义Interop是互操作的含义.Microsoft.Off ...

随机推荐

  1. pc端美化select,jquery获取select中的option的text值

      代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  2. Lvs IP负载均衡技术

    Lvs集群的通用结构 Lvs集群采用IP负载均衡技术,属于IP层的交换(L4),具有很好的吞吐率.调度器分析客户端到服务器的IP报头信息,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器 ...

  3. java使用freemarker导出复杂的excel表格

    正常导出excel表格使用的poi,但是导出复杂的excel有点困难,但是可以使用freemaker模板来导出复杂的excel. 1.都是先生成一个Excel表格的模板,最好是增加一行数据.具体看图里 ...

  4. PHP将多维数组变成一维数组

    function reduceArray($array) { $return = []; array_walk_recursive($array, function ($x) use (&$r ...

  5. shevle模块

    什么是shevle模块 该模块用于序列化python中的数据,但是序列化已经有pickle了为什么出现了shevle? 因为shevle更加简单,封装了文件的读写操作.load和dump操作, 只有一 ...

  6. 2019.4.9 HTML+CSS写静态百度首页

    静态百度首页 4.10更新 更改所有样式为内部引入 换行全部换成使用边距实现 链接:https://pan.baidu.com/s/1iFNnQNw4PUtdj3MjlV-LZA 提取码:5b2i

  7. archlinux安装tftp

    1. 安装  [guo@archlinux ~]$ sudo pacman -S tftp-hpa 2. 启用  [guo@archlinux ~]$ systemctl start tftpd.se ...

  8. 查看centos CPU、内存、版本等信息

    2018-12-29 查看当前linux的系统版本 cat /etc/redhat-release 查看内核版本 uname -a 查看CPU是32位还是64位 getconf LONG_BIT 查看 ...

  9. django Form数据读取问题

    1.在我学习django的过程中,我学习到了一个关于表单验证的问题 2.我们从前端post一个表单,通过urls配置,传给对应的view方法 3.然后再传给Form验证 4.一开始我是很好奇,在vie ...

  10. 引入background和background-size不显示图片

    .bgLeft { position: absolute; left: -95px; background: url("../images/logo_1.png") left to ...