C#在不同平台下DLL的引用问题
缘起
很多时候,我们需要引用在不同平台下的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的引用问题的更多相关文章
- [转]Windows平台下Makefile学习笔记
Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...
- 【VS开发】Windows平台下Makefile学习笔记
作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开 ...
- 未能添加对***.dll的引用 问题解决方法
这个不是什么新问题了,这里说一下我遇到的这个操蛋事. 转载请注明出处 http://www.cnblogs.com/zaiyuzhong/p/6236263.html 我做的和往常一样,找到SDK开发 ...
- Windows平台下Git服务器搭建
第一步:下载Java,下载地址:http://www.java.com/zh_CN/ 第二步:安装Java.安装步骤不再详述. 第三步:配置Java环境变量. 右键”计算机” => ”属性” = ...
- Windows平台下PHP开发环境的配置
Windows平台下PHP开发环境的配置 一.基本环境 1.Windows XP 32位 2.Apache 2.2.25,下载地址:http://mirror.bit.edu.cn/apache/ht ...
- .NET平台下,关于数据持久层框架
在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...
- windows平台下VLC2.0.5编译
windows平台下VLC2.0.5编译说明 时隔一年多,又要搞流媒体了,不过这次是要做流媒体服务器. 暂时决定使用vlc+ffmpeg+live555,虽然听有些前辈说这个组合的性能较差,只能作为学 ...
- 【MongoDB】在windows平台下mongodb的分片集群(五)
本篇接着上面的四篇继续讲述在window平台下mongodb的分片集群搭建. 在分片集群中也照样能够创建索引,创建索引的方式与在单独数据库中创建索引的方式一样.因此这不再多说.本篇主要聚焦在分片键的选 ...
- NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别
NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别 1. Interop含义Interop是互操作的含义.Microsoft.Off ...
随机推荐
- js调试中打印语句
document.write(); console.log(); window.alert();
- ListView ,GridView 通用适配器
前言 接近半年的时间没有写博客了,今年公司的项目有点多,比较忙,没时间写,这是其一.其次是,这半年来,有时间的时候,我都会看看自己以前写的博客,也许是以前刚刚写博客,经验不足,感觉写出来的博客质量很不 ...
- maven初步了解
目标:创建一个父maven项目,有两个子项目分别为serverCenter,dbConnector. 建议:全程不要导入Jar包,全部使用maven依赖的方式导入包. 1.创建maven项目 这个创建 ...
- iOS 开发中类似上下滚动弹幕实现原理
#mark ---滚动弹幕 列表中留有7条记录 大于7条时删除并指引表视图向上滑动 - (void)addRowActionWithContent:(NSString *)str { if (sel ...
- TP5.0学习历程(1)
验证码的使用 控制器代码如下: $captcha = new \think\captcha\Captcha(); if (!$captcha->check($data['code ...
- lua小试牛刀
function function max(num1, num2) if(num1 > num2) then result = num1; else result = num2; end ret ...
- HDU - 5306 剪枝的线段树
题意:给定\(a[1...n]\),\(m\)次操作,0表示使\([L,R]\)中的值\(a[i]=min(a[i],x)\),其余的1是查最值2是查区间和 本题是吉利爷的2016论文题,1 2套路不 ...
- vue中npm run dev 不能自动打开浏览器运行项目
最近用vue2.0 + webpack搭建了环境创建新的项目.出现一个很蹩脚的问题: 在终端输入 npm run dev 的时候,不能自动打开浏览器运行项目. 这段话的意思是:你的应用程序运行地址是: ...
- D3.js绘制平行坐标图
参照:https://syntagmatic.github.io/parallel-coordinates/ 和 https://github.com/syntagmatic/parallel-coo ...
- python入门练习之如何连接数据库
!/usr/bin/python -- coding: UTF-8 -- author = 'luke' from sqlalchemy import create_engine from sqlal ...