缘起

很多时候,我们需要引用在不同平台下的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. 爬虫开发13.UA池和代理池在scrapy中的应用

      今日概要 scrapy下载中间件 UA池 代理池 今日详情 一.下载中间件 下载中间件(Downloader Middlewares) 位于scrapy引擎和下载器之间的一层组件. - 作用: ( ...

  2. docker kafka 修改hostname导致的问题

    昨天发现开发环境的3台kafka无法消费,所以今日kafka的容器执行如下语句 bash-4.4# ./kafka-topics.sh --describe --zookeeper 192.168.0 ...

  3. Spark - 经典案例

    初识 Spark 大数据处理,目前还只是小白阶段,初步搭建起运行环境,慢慢学习之. 本文熟悉下 Spark 数据处理的几个经典案例. 首先将 Scala SDK 的源码导入 IDEA,方便查看和调试代 ...

  4. 吴裕雄 python 机器学习——K均值聚类KMeans模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import cluster from sklearn.metrics ...

  5. Sklearn,TensorFlow,keras模型保存与读取

    一.sklearn模型保存与读取 1.保存 from sklearn.externals import joblib from sklearn import svm X = [[0, 0], [1, ...

  6. Go语言fmt包详解

    格式化输出函数 fmt包含有格式化I/O函数,类似于C语言的printf和scanf.格式字符串的规则来源于C,但更简单一些 1.print和println方法 print输出给定的字符串,如果是数值 ...

  7. Codeforces - 331B2 权值线段树 区间合并

    题意:题目太玄了我无法用语言精简.. 题目要求的操作1是基于值的,所以用普通线段树基本无法维护(反正我不知道) 换做权值型后十分好做,因为连接处必然是更后面的,这时比较一下位置就好 PS.感觉周赛越来 ...

  8. 基于iTop4412的FM收音机系统设计(一)

    说明:第一版架构为:APP+JNI(NDK)+Driver(linux),优点是开发简单,周期短,也作为自己的毕业设计 现在更新第二版,FM服务完全植入Android系统中,成为系统服务,架构为:AP ...

  9. 线性代数与simplex

    线性方程组: \(i:1-n\) \(j:1-m\) \({\begin{cases}a_{11}x_1+a_{12}x_2+a_{13}x_3+\cdots+a_{1n}x_n=b_1\\a_{21 ...

  10. 一个迷你的 Node.js 基于 Express 的 MVR 模式的 API工程 的分析

    1. 工程说明 该工程是基于 Express 库,编写的一个 API 查询返回的一个微型应用. API Resource 就是把 API 的内容当做网络资源去处理.工程中的路由访问也是返回 API 内 ...